Bash 解析curlJSON响应并使用响应构建另一个请求

Bash 解析curlJSON响应并使用响应构建另一个请求,bash,curl,grep,Bash,Curl,Grep,我正在尝试构建一个shell脚本,用于获取随机XKCD漫画的图像url,以便使用Übersicht显示它。由于您只能向XKCD API查询最新漫画或特定漫画,因此我需要: 向http://xkcd.com/info.0.json,获取num元素的值 向http://xkcd.com/XXX/info.0.json其中XXX是num的值 我当前的命令如下所示,并成功返回漫画编号: curl -s 'http://xkcd.com/1510/info.0.json' | grep -Eo '"num

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

  • http://xkcd.com/info.0.json
    ,获取
    num
    元素的值
  • 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+'
    
  • 我还没有弄清楚如何在
    grep
    中使用捕获组,所以我需要对json进行两次grep。常见的建议是使用Mac OS X 10.10不支持的
    -P
  • 我不知道如何将grep的输出(如
    XXX
    )读入第二个
    curl-s'http://xkcd.com/XXX/info.0.json“
    命令
  • 在OS X上,您可以使用系统Perl:

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

    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"
    
    或者更简洁地说,二合一,尽管不太可读:

    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"
    

  • 顺便说一下,我强烈推荐使用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
    

    这在航站楼效果很好,所以我接受了。谢谢,干得好。现在我只需要让它在Übersicht中工作-我得到一个
    八进制转义序列
    错误。@SamuelLindblom我在命令中看不到任何八进制转义序列。我不使用Übersicht-你能详细解释哪一步出错吗?(如果您不确定,可以分解管道并单独测试。)