% 총 % 수신 % 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')"