Holen Sie sich mithilfe der Shell Text zwischen zwei Sonderzeichen in einer Zeile

Holen Sie sich mithilfe der Shell Text zwischen zwei Sonderzeichen in einer Zeile

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 HIJKin 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 IFShierfü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

sedmit einfachem regulären Ausdruck:

$ grep "HIJK" aaa.txt | sed 's/.*="\(.*\)"/\1/g'
My name is HIJK

sedmit 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 -oPwenn Ihre Version grepdies unterstützt:

$ grep "HIJK" aaa.txt | grep -oP '(?<==").*(?=")'
My name is HIJK

Wenn Ihr Anfangsbuchstabe grepgarantiert 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

verwandte Informationen