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

シェルを使用して1行の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

この方法はうまくいきます(ただし可能ではありませsedgrep)。

VAR=$(sed 's/.*"\([^\"]*HIJK[^\"]*\)\"/\1/g' aaa.txt)

可変コンテンツ:

echo $VAR
My name is HIJK

関連情報