如何用yq解析含非嵌套多键(abc.def)的YAML并兼容两种格式?
解决两种YAML格式的yq统一解析问题
方法1:单条yq表达式兼容两种格式
利用yq的空值合并操作符//,同时尝试嵌套路径和顶层带点键的访问路径,自动取存在的结果:
yq '.abc.def.key // .["abc.def"].key' your_file.yaml
当嵌套路径.abc.def.key返回null(对应第一种YAML格式)时,会自动 fallback 到访问顶层键abc.def下的key字段;如果是嵌套格式的YAML,会直接返回嵌套路径的结果。
方法2:预处理YAML统一为嵌套格式
如果需要后续始终用统一的嵌套路径解析,可以先把带点的顶层键拆分为嵌套结构,再执行标准解析:
合并为单条命令
直接完成预处理+解析:
yq 'reduce (keys | select(test("\.")))[] as $k (.; .[$k | split(".")] = .[$k] | del(.[$k])) | .abc.def.key' your_file.yaml
分步处理(便于调试)
- 预处理命令(将带点顶层键转为嵌套结构,输出处理后的YAML):
yq 'reduce (keys | select(test("\.")))[] as $k (.; .[$k | split(".")] = .[$k] | del(.[$k]))' your_file.yaml
- 用标准嵌套路径解析处理后的结果:
yq '.abc.def.key' <(yq 'reduce (keys | select(test("\.")))[] as $k (.; .[$k | split(".")] = .[$k] | del(.[$k]))' your_file.yaml)
内容的提问来源于stack exchange,提问作者bkqdad
相关产品推荐
相关产品推荐

