综合 jq 1.8.0 把 indices/index/rindex 改成码点索引,升级前先过这份破坏性清单

2026-09-17 21:03:24

jq 1.8.0 把 indices/index/rindex 改成码点索引,升级前先过这份破坏性清单

jq 1.8.0 发布于 2025-06-01,1.8.1 在 2025-07-01,1.8.2 在 2026-06-20。官网 ,仓库 。

  • 1.8.0 发布说明:
  • 1.8.2 发布说明:

版本号规则改为 1.X.Y(即 1.8.0 而不是 1.8)。发布产物和 docker 镜像附带 provenance 证明,可用 gh attestation verify 验证。

1.8.0 破坏性变更

1. indices/1index/1rindex/1 改为按码点索引,此前是字节索引。这是最容易踩的一条:任何依赖旧字节偏移做切片、定位的脚本都会算出错误位置。要拿字节索引,用 utf8bytelength/0 自己算。

2. as 绑定语法相对一元/二元运算符的优先级变化,并且允许更多表达式作为对象值:

$ jq -nc '[-1 as $x | 1,$x]'
[1,-1]    # 之前是 [-1,-1]
$ jq -nc '1 | . + 2 as $x | -$x'
-3        # 之前是 -1
$ jq -nc '{x: 1 + 2, y: false or true, z: null // 3}'
{"x":3,"y":true,"z":3}    # 之前是语法错误

3. 支持 Tcl 风格多行注释,可以直接写在 shebang 脚本里。

4. foreach 的 init 回溯(DUPN)修复,同时修复 reduce/foreach 状态变量每次迭代被重置的问题:

$ jq -n 'reduce range(5) as $x (0; .+$x | select($x!=2))'
8
$ jq -nc '[foreach range(5) as $x (0; .+$x | select($x!=2); [$x,.])]'
[[0,0],[1,1],[3,4],[4,8]]

5. 其他:支持 CRLF 换行;提升重复字符串拼接性能。

6. 安全(CVE-2024-23337):修复 jvp_array_write / jvp_object_rehash 的有符号整数溢出。现在数组和对象最大尺寸限制为 536870912(2^29)个元素——超大 JSON 会被拒。

1.8.0 新增函数

  • trim/0ltrim/0rtrim/0:去掉空白。
  • trimstr/1:从两端去掉子串。
jq -n '"foobarfoo" | trimstr("foo")'

输出 "bar"

  • add/1add/0 的生成器版本。
jq -c '.sum = add(.xs[])' <<< '{"xs":[1,2,3]}'

输出 {"xs":[1,2,3],"sum":6}

  • skip/2limit/2 的对偶。
jq -nc '[1,2,3,4,5] | [skip(2; .[])]'

输出 [3,4,5]

  • toboolean/0:字符串转布尔。
jq -n '"true","false" | toboolean'

输出 true / false

  • @urid 格式:@uri 的逆。
jq -Rr '@urid' <<< '%6a%71'

输出 jq

  • pick(stream):从输入对象/数组投影出子集。
jq -n '{"a":1,"b":{"c":2,"d":3},"e":4} | pick(.a,.b.c,.x)'
  • debug(msgs):像 debug,但在写 stderr 前先对输入应用过滤器。
  • scan($re; $flags):文档里有但此前未实现,现在实现了。
  • abs:取绝对值(配合 lengthfabs 保留字面值)。
  • 允许用 $binding 作为对象字面量的 key(此前需要括号)。

CLI 变化

  • JSON 最大解析深度提升到 10000;最大打印深度从 256 提到 10000。
  • 新增 --library-path 作为 -L 的长选项。
  • 修复 --slurp --stream 在输入无尾换行时的行为。
  • --indent 对畸形值报错。
  • --binary 在非 Windows 上的选项解析。
  • Windows 下 $HOME 未设置时的 ~/.jq 处理。
  • 改善错误信息截断;修复 raw 输入破坏多字节字符。

1.8.2 安全修复

1.8.2(2026-06-20)主要是一轮安全收敛:

  • CVE-2026-32316:jvp_string_append / jvp_string_copy_replace_bad 堆溢出。
  • CVE-2026-33947:限制路径深度,防 jv_setpath / jv_getpath / jv_delpaths 栈溢出。
  • CVE-2026-33948:JSON 解析器 NUL 截断。
  • CVE-2026-54679:收紧字符串长度边界,并在 implode 中传播无效 jv。
  • GHSA-gf4g-95wj-4q4r:args2obj() 数组参数路径 use-after-free。
  • GHSA-hj52-j2c9-r8r4:tokenadd 有符号整数溢出导致缓冲区溢出。
  • 限制函数参数与定义数量防 SEGV;预分配 tokenbuf;深嵌套值释放时避免栈溢出;修复内存泄漏与 double free。

其他修复:新增 Windows arm64 构建与 Docker arm/v7;修复 del(.[nan]) 死循环;rtrimstr("") 不再总输出 ""@uri / @urid 修复多字节 UTF-8 破坏;tonumber / toboolean 拒绝内嵌 NUL 的字符串;修复 32 位平台的 2038 年问题;打印深度 256→10000。

升级建议

升到 1.8.2。如果脚本依赖 indices / index / rindex 的字节索引,或依赖旧版 as 绑定优先级,先跑一遍回归再上生产。

复制全文 生成海报 jq Shell JSON 命令行

推荐文章

程序员茄子在线接单