yq V4.x.x如何获取键值?版本升级后命令失效求助
解决yq 3.x到4.x的兼容性问题
1. 修正YAML结构(关键前提)
你提供的YAML存在重复key字段,不符合YAML规范(后出现的key会覆盖前面的),结合原命令中的.applications节点,正确的结构应该是:
applications: a: enabled: true project: ../../a version: v1.1.1 persistence: true b: enabled: true project: ../../b version: v1.1.1 persistence: true c: enabled: true project: ../../c version: v1.1.1 persistence: false
2. 调整yq 4.x命令
yq 4.x(mikefarah/yq)的语法逻辑和3.x差异较大,原命令需修改为:
yq '.applications | to_entries | map(select(.value.enabled == true) | {(.key): .value.persistence}) | add' manifest.yml
命令拆解:
.applications | to_entries:将applications对象转换为[{key: "a", value: {...}}, ...]的数组结构map(select(.value.enabled == true) | {(.key): .value.persistence}):遍历数组,筛选出enabled为true的条目,同时构造{"a": true}格式的键值对对象add:把所有零散的键值对对象合并成一个整体
执行后会得到预期结果:
a: true b: true c: false
如果需要和原结果一致的JSON风格输出,加上-o json参数即可:
yq -o json '.applications | to_entries | map(select(.value.enabled == true) | {(.key): .value.persistence}) | add' manifest.yml
输出:
{"a": true, "b": true, "c": false}
3. 原命令失效原因
原3.x命令中select(.value.enabled == true) .key, .value.persistence的写法,在4.x中会被解析为:先筛选出符合条件的条目并提取所有.key,再尝试提取整个文档根节点的.value.persistence(该节点不存在),因此返回a、b、c后跟着null。
内容的提问来源于stack exchange,提问作者Andres Cabrera
相关产品推荐
相关产品推荐

