如何使用yq 4.35+按字段值匹配列表元素过滤数组
使用 mikefarah/yq 4.35+ 优雅过滤YAML数组
针对你需要保留name字段值属于指定术语列表的YAML数组元素需求,mikefarah/yq 4.35+ 提供了简洁的IN操作符写法,比多个or条件更优雅:
情况1:术语是数组形式
假设你的输入YAML(input.yaml)如下:
- name: bob age: 30 - name: jen age: 28 - name: mork age: 32
直接用IN操作符匹配数组中的术语:
yq 'map(select(.name IN ["jen", "mork"]))' input.yaml
输出结果:
- name: jen age: 28 - name: mork age: 32
情况2:术语是逗号分隔的字符串
如果你的术语是逗号分隔的字符串(比如"jen,mork"),可以先通过split(",")转成数组再匹配:
yq --arg terms "jen,mork" 'map(select(.name IN ($terms | split(","))))' input.yaml
情况3:术语通过JSON格式变量传入
如果需要从外部传入数组格式的术语,用--argjson参数更方便:
yq --argjson terms '["jen", "mork"]' 'map(select(.name IN ($terms)))' input.yaml
关键说明
- 注意
IN是大写的操作符,yq中小写的in不生效,这是你之前写法出错的原因。 - 相比手动写多个
or条件(比如select(.name == "jen" or .name == "mork")),IN写法在术语数量较多时更简洁易维护。
内容的提问来源于stack exchange,提问作者jaundiced
相关产品推荐
相关产品推荐

