シェルを使用して行内の2つの特殊文字の間のテキストを取得する

シェルを使用して行内の2つの特殊文字の間のテキストを取得する

次のファイルから取得した行があります:

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

関連情報