使用jq筛选package.json依赖时如何为所有键添加指定前缀
问题
我正在解析package.json文件,提取所有以@example开头的依赖项。
使用的package.json文件内容如下:
{ "name": "Example", "dependencies": { "@example/alpha" : "1.2.3", "@example/bravo" : "1.2.3", "@example/charlie" : "1.2.3" } }
目前使用如下jq命令可以正常完成筛选操作:
jq -r '.dependencies | select(. != null) | with_entries(select(.key | contains("@example")))' package.json
执行上述命令得到的输出为:
{ "@example/alpha" : "1.2.3", "@example/bravo" : "1.2.3", "@example/charlie" : "1.2.3" }
现在需要对结果的键做转换,为每个键添加**/前缀,最终期望得到如下输出:
{ "**/@example/alpha" : "1.2.3", "**/@example/bravo" : "1.2.3", "**/@example/charlie" : "1.2.3" }
求问如何修改命令,为输出对象的每个键添加该前缀?
解答
直接在with_entries的筛选逻辑后追加键名修改规则即可,修改后的完整命令如下:
jq -r '.dependencies | select(. != null) | with_entries(select(.key | contains("@example")) | .key = "**/" + .key)' package.json
实现原理
with_entries会先将输入对象转换为{key: 原键名, value: 原值}格式的条目数组,待数组处理完成后再转换回对象结构- 筛选出符合规则的条目后,直接对当前条目的
.key属性做字符串拼接,加上**/前缀,最终生成对象时就会使用修改后的新键名 - 补充优化:如果需要严格匹配以
@example开头的键(避免键名中间包含@example字符串的误匹配场景),可以将命令中的contains("@example")替换为startswith("@example"),匹配逻辑更严谨。
内容的提问来源于stack exchange,提问作者PBrown
相关产品推荐
相关产品推荐

