为什么 jq --raw-output 参数无法从 @csv 输出中删除引号?

8 csv string quotes ffprobe jq

我正在尝试使用重新格式化asjq生成的 JSON 输出的某些元素。我很接近(在我看来),但在细节上遇到了困难:ffprobecsv

\n\n

我的ffprobe输出显示在 jq 1.6 游乐场中

\n\n

我正在 MacOS Mojave (10.14.6) 上运行 jq ( jq --version=> )最近的 d/l 二进制文件jq-1.6

\n\n

从我的 Mac 终端上,我的结果是:

\n\n
$ fn_ffprobeall | jq -r \'[.format.filename,.format.format_name,.format.tags.album_artist] | @csv\'\n"01 Jubilee.flac","flac","Bill Charlap Trio"\n\n# where fn_ffprobeall is a function defined as: \nfn_ffprobeall () { ffprobe -i "01 Jubilee.flac" -hide_banner -v quiet -print_format json -show_format -show_streams; }\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这个jq输出(如上所示)不是我需要的...我需要带引号的值""。根据文档--raw-output / -r:​

\n\n
\n

使用此选项,如果 filter\xe2\x80\x99s 结果是字符串,那么它将直接写入标准输出,而不是格式化为带引号的 JSON 字符串。这对于使 jq 过滤器与非基于 JSON 的系统对话非常有用。

\n
\n\n

@tsv另外,使用而不是@csv做正确的事”似乎很奇怪,因为引号将被删除。我想人们可以做一些额外的工作来用 替换tabchars ,,但我想知道在回到这种方法之前我是否遗漏了一些东西。

\n

pii*_*_ke 9

--raw-output选项无法控制传递给 的字符串@csv,因为那时它们不是过滤器的最终结果。他们被引用是因为@csv引用了他们。

jq将 的结果@csv视为单个字符串输出值。该--raw-output选项的工作方式如文档中所述,它不会将输出中的字符串结果编码为 JSON。

如果您尝试不使用该选项,您将看到输出为"\"01 Jubilee.flac\",\"flac\",\"Bill Charlap Trio\"",这是一个正确编码的 JSON 字符串。它有引号,并且转义了不允许的字符。您只需选中和取消选中https://jqplay.org/s/OerK1MlARSRaw Output上的选项即可看到这种差异。

如果您想要 CSV 中不带引号的字符串,您可以使用join(",")代替@csv,但当某些字符串本身包含逗号时,它不会很好地工作。