こんにちは欲しい
curl -v --request POST https://example.com --data-urlencode "username=usr]” --data-urlencode "password=[pass]”
出力を[TOKEN]
ここのフィールドに渡します。
curl -D - --request POST https://example.com --data-urlencode token=[TOKEN]
しかし、最初のコマンドの出力は次のようになるため、JSONには慣れていません。
{
"token": "value_of_token"
}
どうやってこれを受け入れて"value_of_token"
実現できますか[TOKEN]
?
ベストアンサー1
value_of_token
コマンド出力の効率を最大化するには、curl
出力を単一sed
(ストリームエディタ)コマンドにパイプします。コマンド置換を使用して、$()
出力をシェル変数に保存します。
token=$(curl ... | sed -n '/ *"token": *"/ { s///; s/".*//; p; }')
token
その後、その変数を2番目のコマンドのパラメータとして参照できますcurl
。
curl ... token="$token"
コマンドの説明sed
:
sed -n '/ *"token" *: *"/ { s///; s/".*//; p; q; }'
-n
オプションがsed
教えてくれるいいえ各入力行を印刷します。/ *"token" *: *"/
この値を含む行のアドレスを指定します。このパターン(正規表現)は、タグ値を区切る最初の二重引用符を含む行の最初の先頭に一致します。{
指定された行に適用されるコマンドブロックを開始します。s///;
sedコマンドは、以前に一致した内容(アドレス部分から)を削除します。これで、行(「パターンスペース」)は次のようになります。value_of_token"
s/".*//
sedコマンドは、残りの二重引用符("
)とそれの後のすべてのエントリを削除します。p
sedコマンドは、現在(編集された)行(sed
「パターンスペース」という用語)を印刷します。q
sed スクリプトをすぐに終了し、入力を処理しなくなりました。'}' はコマンドブロックを終了します。
例えば、
$ echo '
{
"token": "value_of_token"
}
' | sed -n '/ *"token" *: *"/ { s///; s/".*//; p; }'
value_of_token
$
この方法は、同じ結果を得るために4つの異なるコマンドをパイプするよりもはるかに効率的です。このsed
コマンドは、JSON入力にタブ文字がないと仮定します。タブがある場合は、sed
コマンドを変更する必要があります。