問題

我正在嘗試構建一個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