次のように、「、」で区切られた「key」:「value」ペアを連結した文字列があります。
KEY1:VALUE1, KEY2:VALUE2, KEY3:VALUE3
その文字列から特定の文字列(KEY2など)をgrepする必要があるため、コマンドの出力はVALUE2にする必要があります。
答え1
PCREをサポートする実装を使用してくださいgrep
。
grep -Po '(^|[ ,])KEY1:\K[^,]*'
または:egrep
cut
grep -Eo '(^|[ ,])KEY2:[^,]*' | cut -d: -f2-
どちらの方法でも値にカンマを含めることはできません。
json
たとえば、適切なものがある場合
{ "KEY1":"VALUE1", "KEY2":"VALUE2", "KEY3":"VALUE3" }
あなたが使用できるjq
:
$ jq .KEY2
"VALUE2"
$ jq -r .KEY2
VALUE2
答え2
一般的なgrep
仮定は、VALUEにコロンが含まれていないことです。
grep -o 'KEY2:[^,]\+' | grep -o '[^:]\+$'
答え3
awkを使用してキーと値のペアをレコードとして読み取り、キー、値を最初と2番目のフィールドとして読み込みます。
awk -v RS=' *, *' -v FS=' *: *' '$1=="KEY2"{print $2}' <<<$str
-v RS=' *, *'
,
レコード区切り記号を周囲のスペースに設定-v FS=' *: *'
:
フィールド区切り記号をスペースと周囲のスペースに設定'$1=="KEY2"{print $2}'
キーが見つかったら、値を印刷します。 「KEY2」を希望のキー値に変更してください。
答え4
grep値のみ
printf '%s\n' "$myString" | grep -Po "(?<=KEY2:)[^,]*"
または
grep -Po "(?<=KEY2:)[^,]*" <<< "$myString"