Bash
使用 sed 解析 curl 響應
我正在嘗試
curl
在 macOS 上使用以下命令呼叫 JSON API:curl https://api.ipify.org?format=json
它返回如下內容:
{"ip":"xxx.xxx.xxx.xxx"}
我想從此響應中提取 IP 地址並
curl
使用它執行另一個命令。curl https://api.ipify.org?format=json | curl http://my.api.com?query=<IP RESULT>
我的一些失敗嘗試涉及通過
sed
帶有正則表達式的命令傳遞結果。
我會使用命令替換而不是管道。在 Linux 機器上,我會使用:
curl "http://my.api.com?query=$(curl https://api.ipify.org?format=json | grep -oP 'ip":"\K[0-9.]+')"
在沒有 GNU 工具(例如 macOS)的機器上,以下之一:
curl "http://my.api.com?query=$(curl https://api.ipify.org?format=json | sed -E 's/.*ip":"([0-9.]+).*/\1/')"
甚至
curl "http://my.api.com?query=$(curl https://api.ipify.org?format=json 2>/dev/null | tr -d '"' | sed 's/.*ip:\([0-9.]*\).*/\1/')"
curl 'https://api.ipify.org?format=json' | jq -r '.ip'
這將用於從 .json 中提取與JSON 響應中
jq
的頂級鍵關聯的值。ip``curl
然後,您可以使用它來撥打您的其他
curl
電話:ipaddr=$( curl 'https://api.ipify.org?format=json' | jq -r '.ip' ) curl "http://my.api.com?query=$ipaddr"
另請注意,URL 應始終在命令行中被引用,因為它們可能包含
?
和&
其他 shell 將特別處理的字元。
jq
可通過macOS 上的Homebrew獲得。或者,您可以,正如 pLumo 在評論中所建議的那樣,只是不要從以下位置請求 JSON 格式的響應
api.ipfy.org
:ipaddr=( curl 'https://api.ipify.org' ) curl "http://my.api.com?query=$ipaddr"