% 总计 % 已接收 % 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')"