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/1、index/1、rindex/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/0、ltrim/0、rtrim/0:去掉空白。trimstr/1:从两端去掉子串。
jq -n '"foobarfoo" | trimstr("foo")'
输出 "bar"。
add/1:add/0的生成器版本。
jq -c '.sum = add(.xs[])' <<< '{"xs":[1,2,3]}'
输出 {"xs":[1,2,3],"sum":6}。
skip/2:limit/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:取绝对值(配合length、fabs保留字面值)。- 允许用
$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 绑定优先级,先跑一遍回归再上生产。