컬 명령 출력의 일부를 추출하여 쉘 변수에 할당하는 방법은 무엇입니까?

컬 명령 출력의 일부를 추출하여 쉘 변수에 할당하는 방법은 무엇입니까?
% 총 % 수신 % 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')"

관련 정보