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

Sam*_*lom 8 bash grep curl

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

  1. 发送GET请求http://xkcd.com/info.0.json,获取num元素的值.
  2. 发送另一个请求到http://xkcd.com/XXX/info.0.json哪里XXX是值 num.

我当前的命令如下所示并成功返回漫画编号:

curl -s 'http://xkcd.com/1510/info.0.json' | grep -Eo '"num": \d+' | grep -Eo '\d+'
Run Code Online (Sandbox Code Playgroud)
  1. 我无法弄清楚如何使用捕获组grep,所以我需要两次grep json.常见的建议是使用-P,Mac OS X 10.10不支持.
  2. 我不知道如何将grep(as XXX)的输出读入第二个curl -s 'http://xkcd.com/XXX/info.0.json'命令.

4ae*_*1e1 10

  1. 在OS X上,您可以使用系统Perl:

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

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

    或者更简洁,二合一,尽管不是很易读:

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

顺便说一句,我强烈推荐jq作为命令行JSON处理器.为了提取numjq,它的那样简单

curl -sS http://xkcd.com/info.0.json | jq '.num'
Run Code Online (Sandbox Code Playgroud)

虽然你没有要求它,但这是一个简单的单行程序,jq它提取最新图像的URI:

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

示例输出:

http://imgs.xkcd.com/comics/spice_girl.png
Run Code Online (Sandbox Code Playgroud)