jsonの改行文字をエスケープする方法は?

jsonの改行文字をエスケープする方法は?

改行文字を含むファイルがあります。ファイルをサーバーに
公開すると、サーバーはそれをjsonに解析します。改行文字のため要求を拒否します。しかし、私がこれを行うと: curl

$(echo "$MY_DATA" | sed 's/$//' | tr -d '\n\r')  

動作しますが、新しい行文字は消えます。
改行を維持するためにテキストをエスケープする方法は?
試しましたが、どちらの方法も機能しtr '\n' '\\n'ませんsed 's/\n/\\n/g

答え1

\n元の改行文字を(バックスラッシュと)に変更したいとしますn

tr '\n' '\\n'改行文字をバックスラッシュに変更します(そしてn2番目のグループに追加の文字が含まれています)。改行を終了する行はバッファにロードされず、内部で処理されるためsed 's/\n/\\n/g動作しません。sed

いくつかの選択肢は、次のようなGNU sedです-z(入力を改行で区切るのではなく、NULで区切られた「行」として使用)。

sed -z 's/\n/\\n/g'

そしてPerl(sedとは異なりするバッファから改行文字を取得してs///処理します。)

perl -pe 's/\n/\\n/g'

tr -d '\n\r'それは正確にあなたが要求したように改行文字を削除します。)

答え2

jqデータの正しいJSONエンコーディングのために:

printf '%s' "$MY_DATA" | jq -sR .

-s--slurp)と-R()オプションを--raw-input一緒に使用すると、生の入力データを読み取り、ここで単一のJSONエンコード文字列を生成します。

例:

MY_DATA='line 1
line 2 contains a literal tab   <-- there
line 3 "the end"'

printf '%s' "$MY_DATA" | jq -sR .

出力:

"line 1\nline 2 contains a literal tab\t<-- there\nline 3 \"the end\""

関連情報