我正在处理的json文件在值字段中包含换行符\n
。例如:
{
“a”:“b \ n”
}
我正在尝试生成包含输出的csv文件,其中包含此类值。但是,当我尝试jq -r '[.a]|@csv'
时,我得到:
"b
"
评估\n
个字符。我相信这是-r
选项的工作方式,所以我尝试了没有它的输出jq '[.a]|@csv'
,我得到了:
"\"b\n\""
这更接近我想要的,但输出被引用并且csv-quotes被转义。我想要的输出是:
“B \ n” 个
这对我的实际文件来说很麻烦,因为我的csv输出包含带双引号的值。
例如:
{
"a": "She said: \"Yes!\"\n",
"b": "We said: \"Hello!\"\n"
}
在这种情况下我想要的输出是:
“她说:”是的!\“\ n”,“我们说:”你好!\“\ n”
答案 0 :(得分:3)
你必须逃避换行符。它们是有效的JSON字符,因此不会被区别对待。
[.a, .b] | map(sub("\n"; "\\n")) | @csv
这会给你
"She said: ""Yes!""\n","We said: ""Hello!""\n"
请注意,内部引号加倍,这就是你如何在CSV行中转义双引号。它不会使用反斜杠进行转义。
如果有多个\n
个符号,那么使用gsub
代替sub
就行了。
答案 1 :(得分:0)
根据相关问题(Processing json array with jq and quoted values)的答案,我可以执行以下操作:
while read -r a; read -r b; do echo "$a,$b"; done < <(jq -c '.'a,.b test.txt)
这给出了:
“她说:”是的!\“\ n”,“我们说:”你好!\“\ n”
这不是很一般,因为必须调整它以适应字段数。