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.

dr.doom
quelle

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.

John1024
quelle
Du hast Recht! Die Erklärung war sehr gut.
dr.doom