
次のファイルから取得した行があります:
cat aaa.txt | grep "HIJK"
出力は次のようになります。
HIJK="My name is HIJK"
My name is HIJK
シェル スクリプト内の変数にテキストを取得する必要があります。
これを試してみましたが、うまくいきませんでした:
cat aaa.txt | grep "HIJK" | sed -n '/\"/,/\"/p'
答え1
または、さらに追加するには、次を使用して解決しますawk
:-
awk -F'"' '$1 ~ /HIJK/ {print $2}' aaa.txt
次のように印刷されます:-
My name is HIJK
答え2
IFS
これに使用する
$ 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
答え3
sed
基本的な正規表現の場合:
$ grep "HIJK" aaa.txt | sed 's/.*="\(.*\)"/\1/g'
My name is HIJK
sed
拡張正規表現を使用:
$ grep "HIJK" aaa.txt | sed -r 's/.*="(.*)"/\1/g'
My name is HIJK
二重引用符はすでに一重引用符で囲まれているため、エスケープする必要はありません (したがって、特別なものではないため、リテラルとして扱われます)。
grep -oP
のバージョンがgrep
これをサポートしている場合は、以下も使用できます。
$ grep "HIJK" aaa.txt | grep -oP '(?<==").*(?=")'
My name is HIJK
頭文字がgrep
の前のテキストであることが保証されている場合は=
、これを次のように短縮できます。
$ grep -oP '(?<=HIJK=").*(?=")' aaa.txt
My name is HIJK
答え4
これは動作するはずです ( のみsed
、 なしgrep
):
VAR=$(sed 's/.*"\([^\"]*HIJK[^\"]*\)\"/\1/g' aaa.txt)
変数の内容:
echo $VAR
My name is HIJK