解析 curl json 响应并使用响应构建另一个请求

Parsing a curl json response and using response to build another request

我正在尝试构建一个 shell 脚本来获取随机 XKCD 漫画的图像 url,以便我可以使用 Übersicht 显示它。因为你只能向 XKCD API 询问最新的漫画或特定的漫画,所以我需要:

  1. http://xkcd.com/info.0.json发送GET请求,获取num元素的值。
  2. http://xkcd.com/XXX/info.0.json 发送另一个请求,其中 XXXnum 的值。

我当前的命令是这样的并且成功returns漫画号:

curl -s 'http://xkcd.com/1510/info.0.json' | grep -Eo '"num": \d+' | grep -Eo '\d+'
  1. 我还没弄清楚如何使用 grep 的捕获组,所以我需要对 json 进行两次 grep。常见的建议是使用 -P,Mac OS X 10.10.
  2. 不支持它
  3. 我不知道如何将 grep 的输出(如 XXX)读取到第二个 curl -s 'http://xkcd.com/XXX/info.0.json' 命令中。
  1. 在OS X 你可以使用系统Perl:

     curl -sS http://xkcd.com/info.0.json | /usr/bin/perl -pe 's/.*"num": ([0-9]+).*//'
    
  2. 您可以使用命令替换将输出保存到变量中:

    num=$(curl -sS http://xkcd.com/info.0.json | /usr/bin/perl -pe 's/.*"num": ([0-9]+).*//')
    curl -sS "http://xkcd.com/${num}/info.0.json"
    

    或者更简洁一点,二合一,虽然可读性不是很好:

    curl -sS "http://xkcd.com/$(curl -sS http://xkcd.com/info.0.json | /usr/bin/perl -pe 's/.*"num": ([0-9]+).*//')/info.0.json"
    

顺便说一下,我强烈推荐jq 作为命令行JSON 处理器。用jq提取num,很简单

curl -sS http://xkcd.com/info.0.json | jq '.num'

虽然您没有要求,但这里有一个简单的单行代码 jq 可以提取最新图像的 URI:

curl -sS "http://xkcd.com/$(curl -sS http://xkcd.com/info.0.json | jq '.num')/info.0.json" | jq -r '.img'

示例输出:

http://imgs.xkcd.com/comics/spice_girl.png