如何从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的流程处理:
- YAML转JSON:
yq eval -o json input.yaml > input.json
- jq筛选目标节点:
jq '.MyNodesList |= map(select(.NodeName | IN("test1", "test5")))' input.json > filtered.json
- 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
相关产品推荐
相关产品推荐

