如何在jq中一次性设置多个路径值?支持通配符模式吗?
使用jq批量修改package.json中匹配通配符的依赖项
当然支持!jq 完全能搞定这种批量修改的需求,而且实现起来很灵活。针对你要批量更新dependencies下所有以acme-开头的依赖版本的场景,我们可以用with_entries配合筛选函数来实现,具体看下面的方法:
方法1:用startswith筛选前缀匹配的依赖
这是最直观的方式,专门针对“以某个字符串开头”的场景:
cat package.json | jq '.dependencies |= with_entries(select(.key | startswith("acme-")) | .value = "mytagname")'
命令解释:
.dependencies |=:把dependencies对象作为后续操作的目标,修改后会替换原对象with_entries:遍历对象的键值对(把对象转换成[{key: "...", value: "..."}]的数组,处理后再转回对象)select(.key | startswith("acme-")):筛选出键名以acme-开头的依赖项.value = "mytagname":把筛选出的依赖项的值设置为你想要的标签
方法2:用正则表达式test实现更灵活的匹配
如果需要更复杂的匹配规则(比如包含特定模式、或者非严格前缀的情况),可以用正则表达式:
cat package.json | jq '.dependencies |= with_entries(select(.key | test("^acme-")) | .value = "mytagname")'
这里的"^acme-"是正则表达式,^表示匹配字符串开头,效果和startswith一致;如果要匹配包含acme-的任意键,去掉^即可。
直接修改原文件的技巧
上面的命令会把修改后的内容输出到终端,如果要直接覆盖原文件,可以借助sponge工具(需要先安装moreutils包):
cat package.json | jq '.dependencies |= with_entries(select(.key | startswith("acme-")) | .value = "mytagname")' | sponge package.json
注意:修改前建议备份原文件,避免意外情况导致数据丢失。
为什么不用setpath?
你之前用的setpath适合修改单个明确路径的节点,但批量修改需要先筛选出符合条件的键,再统一设置值,with_entries的方式更适合这种场景。不过如果一定要用setpath,也可以先收集所有匹配的路径,再逐个设置,但写法会繁琐很多,上面的方法更简洁高效。
内容的提问来源于stack exchange,提问作者Stewart
相关产品推荐
相关产品推荐

