如何用mikefarah/yq删除YAML中含指定属性匹配子项的区块
问题出在哪
- 你之前的
del(.. | select(. == "Experimental"))语句,匹配到的是值为Experimental的tags数组元素本身,所以执行删除操作时只会移除这个标签,不会触及它所属的上层API方法块。 - 第二个with_entries的写法层级匹配错误:
paths的下一级是接口路径(比如/uuid/{uuid}),再下一级才是HTTP方法定义(比如delete/get),你要删除的是符合条件的HTTP方法块,不是直接删除路径条目,路径下如果所有方法都被删完才需要清理空路径。
正确实现命令
以下命令适配目前主流的mikefarah yq v4及以上版本:
yq eval ' # 第一步:删除所有tags包含Experimental的HTTP方法块 .paths[] |= with_entries(del(select(.value.tags[] == "Experimental"))) # 第二步:清理删除方法后变成空的路径节点 | .paths |= with_entries(del(select(.value | length == 0))) ' openapi.yaml
如果需要直接修改原文件,加上-i参数即可:
yq eval -i ' .paths[] |= with_entries(del(select(.value.tags[] == "Experimental"))) | .paths |= with_entries(del(select(.value | length == 0))) ' openapi.yaml
命令逻辑说明
- 第一行逻辑:遍历每个接口路径下的所有HTTP方法条目,对每个方法判断它的tags数组中是否包含
Experimental,匹配到就删除整个方法定义块。 - 第二行逻辑:做冗余结构清理,如果某个路径下的所有HTTP方法都被删除,就把这个空的路径节点也一并移除,保证输出的YAML结构整洁。
内容的提问来源于stack exchange,提问作者Tristan Perry
相关产品推荐
相关产品推荐

