Grep findet nach Zuweisung an Variable keine Sequenz


1

Ich renne:

awk -F ',' '{print $2}' data.dat | sort | uniq |  tr '\n' ',' | grep "*)>nS4XkrlH  @XUL"

und die Sequenz befindet sich in Ergebnissen.

Dann renne ich

b=`awk -F ',' '{print $2}' data.dat | sort | uniq |  tr '\n' ','`
echo $b | grep "*)>nS4XkrlH  @XUL"

Es wird jedoch kein Ergebnis zurückgegeben.

Hat jemand eine Idee, warum dies passiert?

Danke für jede Hilfe.

Antworten:


0

Der Schlüsselschlüsselunterschied zwischen diesen beiden Befehlssequenzen besteht darin, dass die zweite enthält, echo $bdie die Aufteilung von Shell- Wörtern durchführt . Ersetzen Sie Folgendes, damit die zweite Befehlssequenz mit der ersten übereinstimmt:

echo $b | grep "*)>nS4XkrlH  @XUL"

mit:

echo "$b" | grep "*)>nS4XkrlH  @XUL"

Wortteilung

Beobachten Sie, wie Leerzeichen in diesen beiden echoAnweisungen behandelt werden:

$ b="a   b c"
$ echo "$b"
a   b c
$ echo $b
a b c

Ohne die doppelten Anführungszeichen führt die Shell eine Wortteilung für die Argumente zu durch echo. Dies bedeutet, dass alle aufeinander folgenden Leerzeichen auf ein einzelnes Leerzeichen komprimiert werden. Bei doppelten Anführungszeichen wird die Wortteilung unterdrückt und das Leerzeichen beibehalten.

Wortteilung und ein grepMuster mit mehreren Leerzeichen

Ihr grepMuster enthält zwei aufeinanderfolgende Leerzeichen. Wenn das Argument to nicht echoin doppelten Anführungszeichen steht, enthält die Ausgabe von echodiese beiden Leerzeichen nicht und es wird keine Übereinstimmung gefunden. Beobachten:

$ b="*)>nS4XkrlH  @XUL"
$ echo $b | grep "*)>nS4XkrlH  @XUL"
$ echo "$b" | grep "*)>nS4XkrlH  @XUL"
*)>nS4XkrlH  @XUL

Das erste grepstimmt mit nichts überein, das zweite mit nichts. Der Unterschied ist die Wortspaltung der Muschel.


Du hast Recht! Die Erklärung war sehr gut.
dr.doom
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.