Ash ShellでJSON応答の特定の部分をフィルタリングする方法

Ash ShellでJSON応答の特定の部分をフィルタリングする方法

-qOでwgetを使用してOpenELECの特定のアップデータURLにアクセスします。これは以下のようなJSON応答を提供します。

{"data":{"update":"OpenELEC-RPi2.arm-5.0.8.tar","folder":"releases","host":"","MD5":""}}

tarの完全なファイル名だけが必要で、他のものは必要ありません。

他のすべての不要な情報をフィルタリングする最良の方法は何ですか?

答え1

ジャックします:

$ jq ".data.update" <<< '{"data":{"update":"OpenELEC-RPi2.arm-5.0.8.tar","folder":"releases","host":"","MD5":""}}'
"OpenELEC-RPi2.arm-5.0.8.tar"

または次のように-r

jq -r ".data.update" <<< '{"data":{"update":"OpenELEC-RPi2.arm-5.0.8.tar","folder":"releases","host":"","MD5":""}}'
OpenELEC-RPi2.arm-5.0.8.tar

引用符なしで(生)文字列を取得します。

答え2

FloHimselfが述べたように、実際のJSONパーサーを使用する必要があります。単純なテキストプロセッサでは簡単に扱えない極端なケースがたくさんあります。

この警告とともに:

sed 's/.*"update":"\([^"]\+\)".*/\1/'

答え3

JSONを次のファイルに保存するとしますjsonfile

awk -F "update" '{print $2}' jsonfile | awk -F ":" '{print $2}' | awk -F "," '{ gsub(/"/,"" ); print $1}'

結果を与えますOpenELEC-RPi2.arm-5.0.8.tar

これはJSONパーサではないため、常に例と同じ構造を使用している場合は機能します。

答え4

を使用してsed出力をwget次にパイプします。

sed -n 's/^.*{"update":"\([^"]*\)".*$/\1/p'

これは、{"update":返された文字列の一部と一致し、一致した部分の後に二重引用符で囲まれた内容を抽出します。

関連情報