有一个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"
}
我试图根据 geturl
并将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 对应的发布日期和标题获取到 shell 变量中。
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
表达式将输出包含两个变量赋值给变量title
和 的shell 代码published
。 shell 将在使用 输出它们之前评估它们printf
。
如果未找到匹配项,则不会更改变量。