
Ich habe eine Zeile, die aus einer Datei kommt über:
cat aaa.txt | grep "HIJK"
Die Ausgabe lautet:
HIJK="My name is HIJK"
Ich muss den Text My name is HIJK
in eine Variable in einem Shell-Skript einfügen.
Ich habe dies versucht, aber es funktioniert nicht:
cat aaa.txt | grep "HIJK" | sed -n '/\"/,/\"/p'
Antwort1
Oder lösen Sie es noch zusätzlich mit awk
: -
awk -F'"' '$1 ~ /HIJK/ {print $2}' aaa.txt
welches druckt:-
My name is HIJK
Antwort2
verwenden Sie IFS
hierfür
$ IFS=\= read var1 var2 <<< $(grep "HIJK" aaa.txt)
$ echo $var1
HIJK
$ echo $var2
"My name is HIJK"
$ var2="${var2%\"}" // remove double quotes on both sides
$ var2="${var2#\"}"
$ echo $var2
My name is HIJK
Antwort3
sed
mit einfachem regulären Ausdruck:
$ grep "HIJK" aaa.txt | sed 's/.*="\(.*\)"/\1/g'
My name is HIJK
sed
mit erweitertem regulären Ausdruck:
$ grep "HIJK" aaa.txt | sed -r 's/.*="(.*)"/\1/g'
My name is HIJK
Die doppelten Anführungszeichen müssen nicht maskiert werden, da sie sich bereits in einfachen Anführungszeichen befinden (und daher als Literale behandelt werden, da sie nichts Besonderes sind).
Sie können auch Folgendes verwenden, grep -oP
wenn Ihre Version grep
dies unterstützt:
$ grep "HIJK" aaa.txt | grep -oP '(?<==").*(?=")'
My name is HIJK
Wenn Ihr Anfangsbuchstabe grep
garantiert der Text vor dem ist =
, können Sie dies folgendermaßen kürzen:
$ grep -oP '(?<=HIJK=").*(?=")' aaa.txt
My name is HIJK
Antwort4
Dies sollte funktionieren (nur sed
, kein grep
):
VAR=$(sed 's/.*"\([^\"]*HIJK[^\"]*\)\"/\1/g' aaa.txt)
Inhalt der Variable:
echo $VAR
My name is HIJK