以下のようなJSON応答を提供するOpenELECの特定のアップデーターURLに対して-qOを指定してwgetを使用しています。
{"data":{"update":"OpenELEC-RPi2.arm-5.0.8.tar","folder":"releases","Host":"","MD5":""}}
Tarの完全なファイル名だけが必要で、他には何も必要ありません。
他のすべての不要な情報を除外する最良の方法は何ですか?
jq は次のようになります:
$ 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
引用符なしの(生の)文字列を取得します。
私は言わなければならないでしょう-Perlを使用してください。それがあなたのOSにインストールされているかどうかは100%わかりませんが、それがインストールされている可能性はかなりあります-それはかなり一般的なベースインストールコンポーネントです。
#!/usr/bin/env Perl
use strict;
use warnings;
use JSON;
print decode_json ( <DATA> ) -> {data} -> {update};
__DATA__
{"data":{"update":"OpenELEC-RPi2.arm-5.0.8.tar","folder":"releases","Host":"","MD5":""}}
これは、次の方法で「ワンライナー」になります。
Perl -MJSON -0ne 'print decode_json($_)->{data}->{update}' jsonfile
この方法の利点は、JSONパーサーを使用しているため、jsonファイルに次のものが含まれている場合に機能することです。
{"data":{"update":"OpenELEC-RPi2.arm-5.0.8.tar","folder":"releases","Host":"","MD5":""}}
または
{
"data" : {
"Host" : "",
"MD5" : "",
"update" : "OpenELEC-RPi2.arm-5.0.8.tar",
"folder" : "releases"
}
}
または、JSONのその他の完全に有効な再フォーマット。これが、パーサーを使用することが本当に理想的な方法である理由です。JSONは公式にはラインフィードの行き先を気にせず、ネストを許可します。これにより、正規表現やラインベースの解析が脆弱になる傾向があります。
sed
を使用して、wget
の出力をパイプします
sed -n 's/^.*{"update":"\([^"]*\)".*$/\1/p'
これは、返された文字列の{"update":
部分と一致し、一致した部分の後に二重引用符で囲まれた内容を抽出します。
FloHimselfが言ったように、実際には実際のJSONパーサーを使用する必要があります。単純なテキストプロセッサでは簡単にカバーできないエッジケースがたくさんあります。
その警告とともに:
sed 's/.*"update":"\([^"]\+\)".*/\1/'
PCREでgrep
を使用する:
grep -Po '(?<=:").*\.tar(?=")'
テスト:
$ foo='{"data":{"update":"OpenELEC-RPi2.arm-5.0.8.tar","folder":"releases","Host":"","MD5":""}}'
$ grep -Po '(?<=:").*\.tar(?=")' <<<"$foo"
OpenELEC-RPi2.arm-5.0.8.tar
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パーサーではないため、例と常に同じ構造を使用している場合はこれが機能することに注意してください。