我将 的输出存储cat ~/path/to/file/blah | jq tojson在一个变量中,以便稍后在带有 JSON 内容的curl POST 中使用。它工作得很好,但它删除了所有换行符。我知道 JSON 不支持换行符,但我希望将它们替换为\n字符,这样当使用数据时,它就不全是一行。
有没有办法做到这一点?
例子:
{
"test": {
"name": "test",
"description": "blah"
},
"test2": {
"name": "test2",
"description": "blah2"
}
}
Run Code Online (Sandbox Code Playgroud)
变成
"{\"test\":{\"name\":\"test\",\"description\":\"blah\"},\"test2\":{\"name\":\"test2\",\"description\":\"blah2\"}}"
Run Code Online (Sandbox Code Playgroud)
但我希望它看起来像
{\n \"test\": {\n \"name\": \"test\",\n \"description\": \"blah\"\n },\n \"test2\": {\n \"name\": \"test2\",\n \"description\": \"blah2\" \n }\n}
Run Code Online (Sandbox Code Playgroud)
实际上,我只是将其转换为 JSON 字符串,以便可以将其作为另一个 JSON 的一部分发布。当它发布时,我希望它具有最初的格式,如果有 \n 字符就可以实现。
我可以通过以下方式手动执行此操作
cat file | sed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g' | sed 's/\"/\\"/g')
但这并不理想。
tojson(或其他 json 输出过滤器)不会格式化 json。它将采用通常的紧凑形式。有一个功能请求,因此请在未来版本中留意。
您可以利用 jq 的常规格式化输出,但您需要将其字符串化。您可以通过将格式化输出作为原始输入来模拟字符串化。这会将所有输入作为单个字符串读入。由于输入只是一个 json 对象,因此它将生成该对象的字符串表示形式。
如果您不介意额外的 jq 调用,您可以这样做:
$ var=$(jq '.' input.json | jq -sR '.')
$ echo "$var"
"{\n \"test\": {\n \"name\": \"test\",\n \"description\": \"blah\"\n },\n \"test2\": {\n \"name\": \"test2\",\n \"description\": \"blah2\"\n }\n}\n"
Run Code Online (Sandbox Code Playgroud)
当然,如果您的输入已经格式化,您可以省略第一个 jq 调用。