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

如何用yq为YAML节点添加父节点键作为license-owner值?

问题:用yq给YAML批量添加license-owner字段并保留完整结构

原始YAML文件

developers:
  bob:
    softwares:
      - yq:
          version: "1.2.3"
      - visual-studio-code:
          version: "1.2.3"
  john:
    softwares:
      - xcode:
          version: "1.2.3"
      - jq:
          version: "1.2.3"

预期修改结果

developers:
  bob:
    softwares:
      - yq:
          version: "1.2.3"
          license-owner: bob
      - visual-studio-code:
          version: "1.2.3"
          license-owner: bob
  john:
    softwares:
      - xcode:
          version: "1.2.3"
          license-owner: john
      - jq:
          version: "1.2.3"
          license-owner: john

错误尝试及问题

使用以下命令:

yq '.developers.* | .softwares[].*.license-owner = (. | key)' test.yml

得到的结果仅返回修改后的片段,丢失了完整的YAML结构:

softwares:
  - yq:
      version: "1.2.3"
      license-owner: bob
  - visual-studio-code:
      version: "1.2.3"
      license-owner: bob
softwares:
  - xcode:
      version: "1.2.3"
      license-owner: john
  - jq:
      version: "1.2.3"
      license-owner: john

解决方法

问题根源是使用了|管道操作符,它会直接输出过滤后的节点,而非修改原结构后返回完整文档。需要改用|=更新操作符,确保修改后保留整个YAML结构。

正确命令(适用于mikefarah/yq v4+)

yq '.developers[] |= (.softwares[] |= (.[] |= .license-owner = (path | .[-3])))' test.yml

更简洁的写法

yq '.developers.*.softwares[].* |= .license-owner = (path | .[1])' test.yml

逻辑说明

  1. .developers.* 遍历每个开发者节点
  2. .softwares[].* 遍历每个软件条目下的具体软件对象
  3. |= 是更新操作符,确保修改后保留原文档的完整层级
  4. path | .[1] 获取当前开发者的键名(如bob、john),作为license-owner的值

运行上述命令后,即可得到符合预期的完整YAML结构。

内容的提问来源于stack exchange,提问作者Sébastien MICHOY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:35:30