资讯详情

如何把 jq 输出值按 NUL 分隔传给下游:--raw-output0 的用法

📅 2026/9/11 14:27:23 | 华诺云谱 👁 阅读
如何把 jq 输出值按 NUL 分隔传给下游:--raw-output0 的用法
如何把 jq 输出值按 NUL 分隔传给下游--raw-output0 的用法【免费下载链接】jqCommand-line JSON processor项目地址: https://gitcode.com/GitHub_Trending/jq/jq当你用 jq 从 JSON 里取出一批字符串再交给xargs或 shell 循环逐条处理时会遇到一个歧义问题这些值本身可能包含空格甚至换行符按换行分隔的文本流无法区分值内部的换行和值与值之间的边界。jq 1.7 起提供了--raw-output0选项像-r一样把字符串原样写到标准输出但在每个输出值之后打印 NUL 字节\0而不是换行符。这样下游可以用 NUL 作为分隔符精确切分每个值。选项含义与版本前提官方手册docs/content/manual/dev/manual.yml对该选项的定义是Like-rbut jq will print NUL instead of newline after each output. This can be useful when the values being output can contain newlines. When the output value contains NUL, jq exits with non-zero code.三点关键信息它隐含-r的行为字符串不加引号原样输出仅把分隔符从换行换成 NUL适用场景正是输出值可能包含换行如果某个输出值本身含 NULjq 会以非零状态码退出。版本方面NEWS.md 在 1.7 的 CLI changes 一节记录Add--raw-output0for NUL (zero byte) separated output且 v1.6 及更早版本的手册中没有该选项条目。所以使用该功能的前提是 jq 1.7 或更新版本。可以先运行jq --help确认输出中出现--raw-output0一行src/main.c 中的帮助文本为--raw-output0 implies -r and output NUL after each output;没有这一行说明当前 jq 版本过旧。确认 NUL 分隔的字节级输出jq 的默认分隔符是换行肉眼无法分辨。NEWS.md 给出的验证方式是用xxd查看十六进制输出文档示例# will output a zero byte after each output $ jq -n --raw-output0 1,2,3 | xxd 00000000: 3100 3200 3300 1.2.3.31/32/33是字符1/2/3的十六进制紧跟其后的00就是 NUL。如果你的环境没有xxd仓库中的回归测试 tests/shtest 展示了更直接的判断对输入[a, b]执行printf [a, b] | jq --raw-output0 .[]期望的字节内容是a\0b\0即每个值后跟一个 NUL共两个 NUL测试通过cmp与期望文件比对。把值按 NUL 分隔传给 xargsNEWS.md 中第一个下游用法是xargs -0-0让 xargs 以 NUL 为分隔符读取参数$ jq -n --raw-output0 a,b,c | xargs -0 -n1 a b c这是三个值a、b、c被 xargs 各自作为独立参数逐条打印的结果。更关键的例子是值内含空格和换行的场景文档示例$ jq -n --raw-output0 a b c, d\ne\nf | xargs -0 printf [%s]\n [a b c] [d e f]第二个值d e f内部含有两个换行但xargs -0仍然把它当作一个完整参数传给printf方括号把它完整地框在了一个参数里。若改用默认的换行分隔输出这个值会被拆成三行xargs会误认为是三个参数——这正是需要 NUL 分隔的原因。在 shell 循环中逐条读取另一个文档给出的下游消费方式是用read -d 以 NUL 为分隔符逐条读取配合进程替换文档示例$ while IFS read -r -d json; do jq .name $json done (jq -n --raw-output0 {name:a b c},{name:d\ne\nf}) a b c d\ne\nf这里外层 jq 输出两个 JSON 对象用 NUL 分隔循环内每次取到的是一个完整的 JSON 文本再交给内层 jq 提取name字段。第二个对象的name值是d e f带内部换行输出中它被完整保留为单个 JSON 字符串d\ne\nf没有被换行边界截断。该写法使用进程替换 (...)属于 bash 语法在 POSIX sh 中不可用。错误边界输出值本身含 NULJSON 字符串里可以合法地包含 NUL例如\u0000。此时 NUL 分隔格式无法自洽jq 会报错退出。NEWS.md 给出的示例文档示例$ jq -n --raw-output0 \u0000 jq: error (at unknown): Cannot dump a string containing NUL with --raw-output0 option行为细节可以从 tests/shtest 中的回归测试读出对输入[a, c\u0000d, b]执行jq --raw-output0 .[]printf [a, c\\u0000d, b] | jq --raw-output0 .[] out测试断言该命令不会成功返回且退出码必须恰为 5测试中elif [ $? -ne 5 ]即判失败同时out文件的内容是a\0——即出错前已写出的部分输出被保留后续值不再输出。手册只笼统说exits with non-zero code具体退出码 5 由回归测试固定下来。所以在脚本中把 jq 的输出继续传给下游时需要检查这段管道里 jq 的退出状态一旦出现含 NUL 的值下游拿到的是不完整的数据流。相关文档选项定义docs/content/manual/dev/manual.ymlv1.7、v1.8 手册中该条目相同引入记录与示例NEWS.md 1.7 一节的 CLI changes字节级行为与退出码断言tests/shtest 中# Regression test for --raw-output0段落实现与错误信息文本src/main.c【免费下载链接】jqCommand-line JSON processor项目地址: https://gitcode.com/GitHub_Trending/jq/jq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。