JQとbashを使用して改行を含むJSONを処理する[閉じる]

JQとbashを使用して改行を含むJSONを処理する[閉じる]

次のようなカール呼び出しを含む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"選択肢を試してみてください。この問題をデバッグするには、環境に関する追加情報が必要です。

おすすめ記事