Bashで.jsonを解析する

Bashで.jsonを解析する

ダウンロードしたファイルの名前を「使い慣れた」方法で変更できるように解析jsonしたいファイルがあります。私が使用するもののいくつかはpodfox次のとおりです。json

{
    "episodes": [
        {
             "title": "Hired and Fired by Little Richard and Jimi\u2019s first trip on LSD",
             "url": "https://www.podtrac.com/pts/redirect.mp3/chtbl.com/track/5899E/traffic.megaphone.fm/HSW2392375869.mp3",
             "downloaded": true,
             "listened": false,
             "published": 1582203660.0
        },
        {
             "title": "Stolen Cars, Broken Taboos, and the Search for Billy Davis",
             "url": "https://www.podtrac.com/pts/redirect.mp3/chtbl.com/track/5899E/traffic.megaphone.fm/HSW5134475908.mp3",
             "downloaded": true,
             "listened": false,
             "published": 1581598860.0
        },
    ]
    "shortname": "27 Club",
    "title": "27 Club",
    "url": "https://feeds.megaphone.fm/HSW5142951139"
}

urlそれを取得してtitleの変数に渡そうとしますbash。 (ほとんどの場合)使用できますが、より良い方法がgrepあることを知っていますが、機能する構文はjqわかりません。jq

これはコマンドラインのgrepで動作しますgrep -B 1 HSW2392375869.mp3 < feed.json | grep "title" | cut -d"\"" -f4が、潜在的にエラーが発生しやすい解決策のようです。

試みるとき:jq -c '.["episodes"].url'シェルは無期限に停止します。jqここではその項目は必要ないので、url(最終)値の合計を検索して返すpublished方法でtitle十分です。

答え1

.episodes実際には、まずフィルタリングしてから内部配列をフィルタリングする必要があります。

 jq ".episodes | .[0]" jsonfile
{
  "title": "Hired and Fired by Little Richard and Jimi’s first trip on LSD",
  "url": "https://www.podtrac.com/pts/redirect.mp3/chtbl.com/track/5899E/traffic.megaphone.fm/HSW2392375869.mp3",
  "downloaded": true,
  "listened": false,
  "published": 1582203660
}

タイトル:

jq ".episodes| .[0].title" jsonfile
"Hired and Fired by Little Richard and Jimi’s first trip on LSD"

出版社:

jq ".episodes| .[0].published" jsonfile
1582203660

url値ベースのクエリの場合

jq '.episodes | .[] | select(.url=="https://www.podtrac.com/pts/redirect.mp3/chtbl.com/track/5899E/traffic.megaphone.fm/HSW2392375869.mp3").title' jsonfile    
"Hired and Fired by Little Richard and Jimi’s first trip on LSD"    

jq '.episodes | .[] | select(.url=="https://www.podtrac.com/pts/redirect.mp3/chtbl.com/track/5899E/traffic.megaphone.fm/HSW2392375869.mp3").published' jsonfile
1582203660

答え2

URLを使用してJSONファイルを照会し、そのURLに対応する発行日とタイトルをシェル変数にインポートしようとしています。

url='http://example.com/some/path'

title=unknown
published=unknown

eval "$(
    jq -r --arg url "$url" '.episodes[] | select(.url == $url) |
        @sh "title=\(.title); published=\(.published)"' file.json
)"

printf 'title     = "%s"\n' "$title"
printf 'published = "%s"\n' "$published"

その後、配列内のオブジェクトを照会してepisodes正しいURLを持つオブジェクトを見つけます。見つかった場合、この式はjq変数sumの2つの変数割り当てを含むtitleシェルコードを出力しますpublished。シェルはprintf

一致するものがない場合、変数は変更されません。

関連情報