如何转义json的换行符?

如何转义json的换行符?

我有一个包含换行符的文件。
我将文件发布curl到服务器,该服务器会将其解析为 json。
由于换行符,它拒绝请求。
但是当我这样做时:

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

它有效,但新行字符消失了。
如何转义文本以保留换行符?
我尝试过tr '\n' '\\n',但sed 's/\n/\\n/g两种方法都不起作用

答案1

我假设您想将原始换行符更改为\n(反斜杠和n)。

tr '\n' '\\n'会将换行符更改为反斜杠(然后n第二组中有一个额外的内容)。sed 's/\n/\\n/g不起作用,因为sed不会将行终止换行符加载到缓冲区中,而是在内部处理它。

一些替代方案是 GNU sed with -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\""

相关内容