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

使用yq转换并合并数组:如何将结果写入file1.yaml?

解决yq合并YAML数组并写入文件的问题

问题分析

你的核心问题是处理多文件时错误地在单文件处理阶段跨文件引用数据——yq默认逐文件处理,当处理第二个文件(fi==1)时,select(fi==0)会返回null,导致赋值失败。需要先将两个文件内容加载到变量中,再执行合并操作。

正确实现步骤

1. 提取并转换File2的端口数据

从File2中提取traefik.ports下的所有nodePort,转换为仅包含hostPort字段的对象数组:

$file2.traefik.ports[] | {hostPort: .nodePort}

执行后得到:

- hostPort: 32555
- hostPort: 30000

2. 合并到File1的数组中

将转换后的数组追加到File1的nodes[0].extraPortMappings数组末尾:

$file1.nodes[0].extraPortMappings += ($file2.traefik.ports[] | {hostPort: .nodePort})

3. 完整执行命令

使用--slurp(或-s)参数将两个文件加载为数组,通过索引访问文件内容:

yq -s '
  $file1 = .[0] |
  $file2 = .[1] |
  $file1.nodes[0].extraPortMappings += ($file2.traefik.ports[] | {hostPort: .nodePort}) |
  $file1
' file1.yaml file2.yaml

4. 写入File1原文件

添加-i参数直接修改原文件(建议先备份原文件):

yq -i -s '
  $file1 = .[0] |
  $file2 = .[1] |
  $file1.nodes[0].extraPortMappings += ($file2.traefik.ports[] | {hostPort: .nodePort}) |
  $file1
' file1.yaml file2.yaml

验证结果

执行命令后,file1.yaml会生成你期望的输出:

kind: Cluster
apiVersion: kind,x-k8s.io/v1alpha4
nodes:
  - role: control-plane
    extraPortMappings:
      - containerPort: 1234
        hostPort: 31234
      - hostPort: 32555
      - hostPort: 30000

内容的提问来源于stack exchange,提问作者Arikael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:08:25