在 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"
}

我试图根据 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

如果未找到匹配项,则不会更改变量。

相关内容