我有一个包含换行符的文件。
我将文件发布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\""