ダウンロードしたファイルの名前を「使い慣れた」方法で変更できるように解析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
。
一致するものがない場合、変数は変更されません。