jq - 不评估换行符的原始输出

jq - raw output without evaluating new line character

我正在处理的 json 文件的值字段中包含换行符 \n。例如: { "a": "b\n" }

我正在尝试生成包含输出的 csv 文件,其中包括此类值。但是,当我尝试 jq -r '[.a]|@csv' 时,我得到:

"b
"

\n 字符被评估。我相信这就是 -r 选项的工作方式,所以我尝试了没有它的输出,jq '[.a]|@csv',我得到:

"\"b\n\""

这更接近我想要的,但输出被引用并且 csv 引号被转义。我想要的输出是:

"b\n"

这对我的实际文件来说很麻烦,因为我的 csv 输出包含带双引号的值。

例如:

{
  "a": "She said: \"Yes!\"\n",
  "b": "We said: \"Hello!\"\n"
}

在这种情况下我想要的输出是:

"She said: \"Yes!\"\n","We said: \"Hello!\"\n"

您必须转义换行符。它们是有效的 JSON 个字符,因此不会被区别对待。

[.a, .b] | map(sub("\n"; "\n")) | @csv

这会给你

"She said: ""Yes!""\n","We said: ""Hello!""\n"

请注意,内部引号是双引号,这就是您在 CSV 行中转义双引号的方式。它没有使用反斜杠转义。

如果有多个 \n 符号,那么使用 gsub 而不是 sub 就可以了。

根据对相关问题的回答 (),我可以执行以下操作:

 while read -r a; read -r b; do echo "$a,$b"; done < <(jq -c '.'a,.b test.txt)

这给出:

"She said: \"Yes!\"\n","We said: \"Hello!\"\n"

不过这不是很通用,因为必须对其进行调整以适应字段数。