我将cat ~/path/to/file/blah | jq tojson
的输出存储在一个变量中,以便稍后在带有JSON内容的curl POST中使用。它运行良好,但它删除所有换行符。我知道JSON不支持换行符,但我希望将它们替换为\n
个字符,因此在使用数据时,它不是一行。
有办法做到这一点吗?
示例:
{
"test": {
"name": "test",
"description": "blah"
},
"test2": {
"name": "test2",
"description": "blah2"
}
}
变为
"{\"test\":{\"name\":\"test\",\"description\":\"blah\"},\"test2\":{\"name\":\"test2\",\"description\":\"blah2\"}}"
但我希望它看起来像
{\n \"test\": {\n \"name\": \"test\",\n \"description\": \"blah\"\n },\n \"test2\": {\n \"name\": \"test2\",\n \"description\": \"blah2\" \n }\n}
我实际上只将其转换为JSON字符串,因此可以将其作为另一个JSON的一部分发布。什么时候发布,我希望它有原来的格式,如果有\ n个字符就可以实现。
我可以通过
手动执行此操作 cat file | sed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g' | sed 's/\"/\\"/g')
但这并不理想。
答案 0 :(得分:1)
tojson
(或其他json输出过滤器)不会格式化json。它将采用通常的紧凑形式。这里有一个feature request,所以在未来的版本中请注意这一点。
您可以利用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"
当然,如果你的输入已经格式化,你可以省去第一个jq电话。
答案 1 :(得分:0)
如果你的输入只包含一个JSON值,那么jq
并不是真的在这里买你:你需要的只是逃避JSON中有效的几个字符,但不要用JSON字符串表示自己,您可以使用命令行实用程序轻松地进行通用字符串处理。
例如:
perl -wpe '
s/\\/\\<backslash>/g;
s/\t/\\t/g;
s/\n/\\n/g;
s/\r/\\r/g;
s/"/\\"/g;
s/\\<backslash>/\\\\/g
' ~/path/to/file/blah