さまざまなJSON文字列の値を解析します(jqを除く)。

さまざまなJSON文字列の値を解析します(jqを除く)。

私は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出力で誤った値が選択されます。Contentawk '{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権限なしでホームディレクトリにインストールされます(外部ランタイム依存関係なし)。

関連情報