web-dev-qa-db-ja.com

ashシェルでJSON応答の特定の部分を除外するにはどうすればよいですか?

以下のようなJSON応答を提供するOpenELECの特定のアップデーターURLに対して-qOを指定してwgetを使用しています。

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

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

他のすべての不要な情報を除外する最良の方法は何ですか?

1
James White

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

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

4
FloHimself

私は言わなければならないでしょう-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は公式にはラインフィードの行き先を気にせず、ネストを許可します。これにより、正規表現やラインベースの解析が脆弱になる傾向があります。

1
Sobrique

sedを使用して、wgetの出力をパイプします

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

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

1
nitishch

FloHimselfが言ったように、実際には実際のJSONパーサーを使用する必要があります。単純なテキストプロセッサでは簡単にカバーできないエッジケースがたくさんあります。

その警告とともに:

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

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
0
heemayl

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パーサーではないため、例と常に同じ構造を使用している場合はこれが機能することに注意してください。

0
jcbermu