![Bash:如何从多行字符串构建 JSON](https://linux22.com/image/172400/Bash%EF%BC%9A%E5%A6%82%E4%BD%95%E4%BB%8E%E5%A4%9A%E8%A1%8C%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%9E%84%E5%BB%BA%20JSON%20.png)
我的awk
输出是多行字符串。
awkresult=`awk '{...}'`
echo "{ \"result\": \"$awkresult\" }" > result.json
多行必须保留在结果字符串中。
我认为最好的方法是在每行末尾插入换行符awkresult
。
我的awk
脚本无法修改。我应该如何修改我的代码?
答案1
请注意,值中的换行符必须按照 JSON 进行编码\n
。 JSON 解析器会将这些解码为真正的换行符。插入一个文字JSON 文件中值中的换行符会导致 JSON 文档损坏。
使用jo
(在 shell 中生成 JSON 输出的工具,具有正确的编码等):
awkresult='some string
with newlines
the end'
jo result="$awkresult"
这将导致输出
{"result":"some string\nwith newlines\nthe end"}
漂亮的打印:
jo -p result="$awkresult"
这导致
{
"result": "some string\nwith newlines\nthe end"
}
将输出重定向jo
到文件以保存输出,例如
jo result="$awkresult" >result.json
答案2
您可以使用此处文档,如下所示:
echo "$(cat <<EOM
{ "result" : "$awkresult" }
EOM
)" > result.json
请注意 echo 语句中的双引号 " ,它保留所有换行符,并且您不必转义其中的 \" 引号。
答案3
您的想法是正确的,但不要使用双引号来编码 JSON 字符串。在 周围使用单引号{..}
,使用特殊的引号序列来展开awkresult
单引号内部
awkresult='foo\nbar\nzoo\n'
现在,使用变量作为
echo '{ "result": "'"$awkresult"'" }' > result.json
另请记住,JSON 规范“不允许”嵌入文字换行控制字符。您可以验证 JSON 片段是否有效
echo '{ "result": "'"$awkresult"'" }' | jq .
{
"result": "foo\nboo\nbar\n"
}
答案4
您已经发布的代码将在以下位置保留换行符$awkresult
:
$ awkresult='foo
bar'
$ echo "{ \"result\": \"$awkresult\" }"
{ "result": "foo
bar" }
但这里有一个更简单、更强大、更便携的方法来做到这一点:
awkresult="$(awk '{...}')"
printf '{ "result": "%s" }\n' "$awkresult" > result.jso
或者你的意思是你必须用\n
这样的字符串替换换行符
$ printf '{ "result": "%q" }\n' "$awkresult"
{ "result": "$'foo\nbar'" }
或者是其他东西?