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"
不过这不是很通用,因为必须对其进行调整以适应字段数。
我正在处理的 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"
不过这不是很通用,因为必须对其进行调整以适应字段数。