私はJSON出力を読み取り、さまざまなJSON変数または文字列の値を解析する必要があるbashスクリプトを作業しています。サンプル出力です。Content
他の変数の横または別の変数から値を読み取る必要があります。例えば、
を見つけてContent
印刷できますValue1
。
検索してDeviceType
印刷できます。Value4
サンプル出力:
{"Content":"Value1","CreationMethod":"Value2","database":"Value3","DeviceType":"Value4"}
sedとawkの組み合わせを試しましたが、出力sed 's/["]/ /g' | awk '{print $4}'
が同じ位置にある場合にのみ可能でした。それ以外の場合、値が範囲外の位置の変更により、Content
他のJSON出力で誤った値が選択されます。Content
awk '{print $4}'
答え1
まあ、私が正しく理解したら、GNUを使って次のようにgrep
しますtr
。
tr ',' '\n' < foo | grep -Po "(?<=Content\":\").*(?=\")"
出力:
Value1
他のキーワードを使う:
tr ',' '\n' < foo | grep -Po "(?<=database\":\").*(?=\")"
Value 3
新しい行でカンマを置き換えます。
tr ',' '\n'
Grepは正規表現と同様にPerl-o
専用です。-P
grep -Po
パターンのキャプチャ("<keyword>:"")<value>(")
と印刷ただ <value>
。
答え2
jq
ますます少ないperl
ハンマーでOPの意図を使用しますsed
/awk
s="Content"; sed 's/[{}"]//g' file | awk -v s=$s -F ":" -v RS=',' '($1 == s) {print $2}'
答え3
わかった、都合ないということは認めて…。
$ awk 'BEGIN {FPAT="\"[^\"]+\""; RS=","; pat=ARGV[1]; delete ARGV[1]}
$1 ~ pat {print $2} ' Content ex.json
"Value1"
答え4
$ jq -r '.Content' file
Value1
$ jq -r '.DeviceType' file
Value4
JSONを正確かつ安全に解析するためにインストールしない理由はなくjq
、JSONエンコード文字列などを手動でデコードすることを心配する必要はありません。
jq
実用的な事項ダウンロード可能root権限なしでホームディレクトリにインストールされます(外部ランタイム依存関係なし)。