キー:値のペアで連結された文字列内の特定のキー値を見つけます。

キー:値のペアで連結された文字列内の特定のキー値を見つけます。

次のように、「、」で区切られた「key」:「value」ペアを連結した文字列があります。

KEY1:VALUE1, KEY2:VALUE2, KEY3:VALUE3

その文字列から特定の文字列(KEY2など)をgrepする必要があるため、コマンドの出力はVALUE2にする必要があります。

答え1

PCREをサポートする実装を使用してくださいgrep

grep -Po '(^|[ ,])KEY1:\K[^,]*'

または:egrepcut

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"

関連情報