如何用yq通过正则实现YAML反向匹配并移除指定对象?
使用yq实现YAML键的反向匹配筛选需求
完全可以用yq实现这个需求,以下是针对mikefarah/yq v4+(目前主流的yq版本)的具体解决方案:
核心命令
yq eval 'del(keys | select(test("^(?!.*non-production).*production$")) as $key | .[$key])' input.yaml
命令解释
这个命令通过正则表达式精准匹配需要删除的键,并执行删除操作:
del(...):yq的删除函数,用于移除指定节点keys | select(test("^(?!.*non-production).*production$")):筛选符合条件的键名,正则表达式的逻辑是:^(?!.*non-production):负向预查,确保键名中不包含non-production子串.*production$:匹配以production结尾的键名
as $key | .[$key]:将筛选出的键对应的值节点传递给del完成删除
效果验证
针对你提供的输入YAML:
.... .... validate-common-non-production: stage: validate-common-non-production deploy-common-non-production: stage: deploy-common-non-production validate-common-production: stage: validate-common-production deploy-common-production: stage: deploy-common-production ... ...
执行命令后,输出会保留所有不以production结尾的节点,以及包含non-production的节点,最终结果和你期望的一致:
.... .... validate-common-non-production: stage: validate-common-non-production deploy-common-non-production: stage: deploy-common-non-production ... ...
注意事项
如果你使用的是旧版本的yq(比如v3或kislyuk/yq),语法会有所不同,建议升级到mikefarah/yq v4+以获得更完善的正则支持和功能。
内容的提问来源于stack exchange,提问作者pavan reddy
相关产品推荐
相关产品推荐

