jq - 未评估换行符

时间:2016-05-20 14:08:08

标签: jq

我正在处理的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”

2 个答案:

答案 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”

这不是很一般,因为必须调整它以适应字段数。