カールコマンド出力の一部を抽出してシェル変数に割り当てるには?

カールコマンド出力の一部を抽出してシェル変数に割り当てるには?
% 合計 % 受信 % Xferd 平均速度時間時間時間現在
Dload アップロード総費用 左速度
100277100174100103464274
--:--:-- --:--:-- --:--:--
第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回以上」を意味します。
  • \1「最初のグループ」を意味するので、その中に何がありますか?()
  • p「一致する行だけを印刷」を意味します。

変数に保存するには、次のようにバックティック `を使用して保存します。

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

関連情報