如何为json转义换行符?

Jim*_*Jim 6 shell bash shell-script json

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

$(echo "$MY_DATA" | sed 's/$//' | tr -d '\n\r')  
Run Code Online (Sandbox Code Playgroud)

它有效,但新行字符不见了。
如何转义文本以保留换行符?
我试着tr '\n' '\\n'和sed 's/\n/\\n/g既不工作方法

Kus*_*nda 10

用于jq对数据进行正确的 JSON 编码:

printf '%s' "$MY_DATA" | jq -sR .
Run Code Online (Sandbox Code Playgroud)

-s( --slurp) 和-R( )选项--raw-input一起使用时,将读取原始输入数据并从中创建单个 JSON 编码字符串。

例子:

printf '%s' "$MY_DATA" | jq -sR .
Run Code Online (Sandbox Code Playgroud)

输出:

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

printf '%s' "$MY_DATA" | jq -sR .
Run Code Online (Sandbox Code Playgroud)


ilk*_*chu 9

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

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

一些替代方案是 GNU sed -z(将输入作为 NUL 分隔的“行”,而不是换行分隔):

sed -z 's/\n/\\n/g'
Run Code Online (Sandbox Code Playgroud)

和 Perl(与 sed 不同,它确实在缓冲区中使用换行符,因此s///可以对其进行处理):

perl -pe 's/\n/\\n/g'
Run Code Online (Sandbox Code Playgroud)

(tr -d '\n\r'确实会删除换行符,这正是您要求它做的。)

  • @Jim,不,“a”被翻译为文字反斜杠,然后“b”翻译为“n”,“c”保持不变。当“tr”获取字符串“\\n”时,它用两个反斜杠表示一个反斜杠,就像用“\n”表示换行符一样。`| tr 'ab' '\\x'` 类似,只需将 `b` 更改为 `x` 即可。这里没有对换行符的翻译。(是的,评论格式并不喜欢反斜杠和反引号) (2认同)