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)
我假设您想将原始换行符更改为\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'确实会删除换行符,这正是您要求它做的。)