如何提取curl命令的部分输出并将其分配给shell变量?

如何提取curl命令的部分输出并将其分配给shell变量?
% 总计 % 已接收 % Xferd 平均速度 时间 时间 时间 当前
Dload 上传总花费左速度
100 277 100 174 100 103 464 274
--:--:-- --:--:-- --:--:--
第736章ES_7PBXiq5gg67u9Vr","完成百分比":0.0,"状态":"inProg
res"},"meta":{"requestId":"************************","httpStatus":"200 -
好的”}}

我需要提取以 ES_ 开头的突出显示部分

我尝试使用

curl <...> | sed '"progressId"\:"(ES_[A-Za-z0-9]{15})'

但是它仍然将整个输出存储在环境变量中。

答案1

最好使用json解析工具来解析json。jq是一种流行的。

set -o pipefail # if supported by your shell
var=$(curl -s "$url" | jq -r .result.progressId) || exit

或者:

json=$(curl -s "$url") || exit
var=$(printf '%s\n' "$json" | jq -r .result.progressId) || exit

(这允许您稍后从该 json 数据中提取更多信息)。

答案2

这应该有效:

curl <...> | sed -E -n 's/.*(ES[^"]+).+/\1/p'

解释:

  • .*表示“任意字符 0 次或多次”
  • ES[^"]+表示“ES 后跟任何不是“一次或多次”的字符
  • .+表示“任何字符 1 次或多次”
  • \1意思是“第一组”,所以里面有什么()
  • p意思是“只打印匹配的行”

如果你想将它存储在一个变量中,你可以使用反引号 ` 来完成,如下所示:

VAR="$(curl <...> | sed -E -n 's/.*(ES[^"]+).+/\1/p')"

相关内容