改行文字を含むファイルがあります。ファイルをサーバーに
公開すると、サーバーはそれを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'
改行文字をバックスラッシュに変更します(そしてn
2番目のグループに追加の文字が含まれています)。改行を終了する行はバッファにロードされず、内部で処理されるため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\""