解析 curl json 响应并使用响应构建另一个请求
Parsing a curl json response and using response to build another request
我正在尝试构建一个 shell 脚本来获取随机 XKCD 漫画的图像 url,以便我可以使用 Übersicht 显示它。因为你只能向 XKCD API 询问最新的漫画或特定的漫画,所以我需要:
- 向
http://xkcd.com/info.0.json
发送GET
请求,获取num
元素的值。
- 向
http://xkcd.com/XXX/info.0.json
发送另一个请求,其中 XXX
是 num
的值。
我当前的命令是这样的并且成功returns漫画号:
curl -s 'http://xkcd.com/1510/info.0.json' | grep -Eo '"num": \d+' | grep -Eo '\d+'
- 我还没弄清楚如何使用
grep
的捕获组,所以我需要对 json 进行两次 grep。常见的建议是使用 -P
,Mac OS X 10.10. 不支持它
- 我不知道如何将 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]+).*//'
您可以使用命令替换将输出保存到变量中:
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
我正在尝试构建一个 shell 脚本来获取随机 XKCD 漫画的图像 url,以便我可以使用 Übersicht 显示它。因为你只能向 XKCD API 询问最新的漫画或特定的漫画,所以我需要:
- 向
http://xkcd.com/info.0.json
发送GET
请求,获取num
元素的值。 - 向
http://xkcd.com/XXX/info.0.json
发送另一个请求,其中XXX
是num
的值。
我当前的命令是这样的并且成功returns漫画号:
curl -s 'http://xkcd.com/1510/info.0.json' | grep -Eo '"num": \d+' | grep -Eo '\d+'
- 我还没弄清楚如何使用
grep
的捕获组,所以我需要对 json 进行两次 grep。常见的建议是使用-P
,Mac OS X 10.10. 不支持它
- 我不知道如何将 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]+).*//'
您可以使用命令替换将输出保存到变量中:
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