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

如何从YAML中删除不匹配指定键的节点?

筛选YAML列表中指定NodeName节点的解决方案

原始YAML内容:

MyNodesList:
  - NodeName: test1
    status: active

  - NodeName: test2
    status: active
  
  - NodeName: test4
    status: active

  - NodeName: test5
    status: active

需要保留NodeName为test1、test5的节点,最终得到如下结果:

MyNodesList:
  - NodeName: test1
    status: active

  - NodeName: test5
    status: active

方法1:使用yq工具(推荐)

yq是专门处理YAML的命令行工具,操作YAML结构更直接高效。

基础筛选命令

直接指定需要保留的NodeName:

yq eval '.MyNodesList |= map(select(.NodeName == "test1" or .NodeName == "test5"))' input.yaml

如果需要直接覆盖原文件,加上-i参数:

yq eval -i '.MyNodesList |= map(select(.NodeName == "test1" or .NodeName == "test5"))' input.yaml

批量节点筛选(适合长列表)

先定义目标节点数组,再执行筛选:

yq eval --argjson names '["test1", "test5"]' '.MyNodesList |= map(select(.NodeName == $names[]))' input.yaml

方法2:jq+格式转换工具

如果系统没有yq,可以通过YAML转JSON、jq筛选、再转回YAML的流程处理:

  1. YAML转JSON:
yq eval -o json input.yaml > input.json
  1. jq筛选目标节点:
jq '.MyNodesList |= map(select(.NodeName | IN("test1", "test5")))' input.json > filtered.json
  1. JSON转回YAML:
yq eval -P filtered.json > output.yaml

方法3:Python脚本自定义处理

如果需要更灵活的逻辑控制,用Python脚本实现:

import yaml

# 读取原始YAML
with open('input.yaml', 'r') as f:
    yaml_data = yaml.safe_load(f)

# 定义需保留的NodeName集合
target_nodes = {'test1', 'test5'}

# 筛选节点
yaml_data['MyNodesList'] = [
    node for node in yaml_data['MyNodesList'] 
    if node.get('NodeName') in target_nodes
]

# 写入结果文件
with open('output.yaml', 'w') as f:
    yaml.dump(yaml_data, f, sort_keys=False, default_flow_style=False)

执行脚本后,output.yaml即为筛选后的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:10:57