You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选包含指定子键的YAML顶级映射键(优先用yq)

筛选YAML中包含指定子键的顶级映射键(yq优先方案)

问题场景

现有如下YAML文件(test.yml),需要提取所有包含bar子键的顶级映射键,最终只保留foo和quz对应的内容:

foo:
  bar:
    - "hello"
quz:
  bar:
    - "hi"
der:
  boo: true

原命令失效原因

你之前尝试的两个命令:

yq eval 'select(.[] | has("bar"))' test.yml
yq eval 'select(.[] | .bar != null)' test.yml

问题出在**select作用的对象不对**:.[]会把根映射的所有值展开成序列,select只能筛选出符合条件的单个值,没法保留原有的键值对结构,自然得不到期望的映射结果。而单独执行yq eval '.[] | has("bar")' test.yml能输出正确布尔值,是因为这个命令只是逐个判断每个顶级值是否包含bar,并没有关联到对应的键。

正确的yq解决方案(v4版本,mikefarah/yq)

使用with_entries函数,它专门用于处理映射的键值对,能筛选并保留完整的键值结构:

yq eval 'with_entries(select(.value | has("bar")))' test.yml

执行后输出结果:

foo:
  bar:
    - "hello"
quz:
  bar:
    - "hi"

命令解释

  • with_entries:遍历映射的每个键值对,将每个条目转换为包含.key(键名)和.value(对应值)的对象
  • select(.value | has("bar")):筛选出.value(即顶级键对应的值)中包含bar子键的条目
  • 最终所有符合条件的条目会被重新组合成完整的YAML映射

备选方案:Python脚本(PyYAML)

如果无法使用yq,可借助PyYAML库实现:

  1. 先安装依赖:pip install pyyaml
  2. 编写脚本:
import yaml

# 读取原YAML文件
with open('test.yml', 'r', encoding='utf-8') as f:
    yaml_data = yaml.safe_load(f)

# 筛选包含bar子键的顶级键
filtered_data = {key: val for key, val in yaml_data.items() if 'bar' in val}

# 写入筛选后的结果
with open('filtered_result.yml', 'w', encoding='utf-8') as f:
    yaml.dump(filtered_data, f, sort_keys=False, default_flow_style=False)

这个脚本会保留原YAML的键顺序,输出符合要求的结果。

内容的提问来源于stack exchange,提问作者I_jony_I

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 17:33:11