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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:30:52