问题

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

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

我目前的命令看起来像这样,并成功返回漫画号:

 curl -s 'http://xkcd.com/1510/info.0.json' | grep -Eo '"num": \d+' | grep -Eo '\d+'
 
  1. 我无法弄清楚如何使用grep的捕获组,所以我需要两次grep json.通常的建议是使用-P,这在Mac OS X 10.10中不支持.
  2. 我不知道如何将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
 

  相同标签的其他问题

bashcurlgrep