次のようなカール呼び出しを含むJSONを受け取ります。
output="$(curl -s "$api_url")"
この出力はJSON形式で、jqでは次のように処理する必要があります。
{
"test": "Hello\nThere!"
}
echo
現在、jqが動作するようにするために、次のパイプラインの組み合わせを使用しています。
test="$(echo "$output" | jq -r ".test")"
ただし、JSONエラーとJQエラーに新しい行が含まれているため、サンプル入力では機能しません。parse error: Invalid string: control characters from U+0000 through U+001F must be escaped at line 2, column 6
jqが理解できるようにデータを変更する方法はありますか?
ベストアンサー1
だから言葉入力は次のとおりです。
$ output='{
> "test": "Hello
> There!"
> }'
$ echo "$output" | jq -r ".test"
parse error: Invalid string: control characters from U+0000 through U+001F must be escaped at line 3, column 7
JSON複数行の文字列はありません。したがって、APIからこのリテラルを取得すると、次のようになります。APIエラー、そしてサーバー側で修正する必要があります。
APIが実際にこのようなものを返すと言ったので、{"test": "Hello\nThere!"}
Bash 4.4.23のjq 1.5で動作するので、問題はコマンドにあるべきです。
$ output='{"test": "Hello\nThere!"}'
$ echo "$output" | jq -r ".test"
Hello
There!
eval
(悪いことです)、echo -e
他の特別なコマンドがエスケープ文字を復号化する可能性があります。printf '%s' "$output"
選択肢を試してみてください。この問題をデバッグするには、環境に関する追加情報が必要です。