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

如何在Bash脚本中用yq合并YAML文件、去重并生成指定命令串?

Bash脚本中用yq合并YAML并生成指定命令串

需求说明

  • 合并file1.yaml和file2.yaml两个YAML文件
  • 仅保留以FT开头的键值对
  • 保留file1.yaml中的FT1、FT2,自动覆盖file2.yaml中的同名重复项
  • 将最终结果格式化为--from-literal=键=值的命令参数串

文件内容

file1.yaml

FT1: true
FT2: true

file2.yaml

FT1: false
FT2: false
FT3: false
FT4: false
Blah1: abc
Blah2: efg

期望输出

--from-literal=FT1=true --from-literal=FT2=true --from-literal=FT3=false --from-literal=FT4=false

已遇到的问题

单独执行以下命令只能提取单个文件中FT开头的键值对,但无法完成合并去重和最终格式化:

yq eval '. | to_entries| .[] | select(.key == "FT*") | [.key, .value] | join("=")' file1.yaml

解决方案

完整命令

yq eval-all '
. as $item ireduce ({}; . * $item) |
to_entries | map(select(.key | test("^FT"))) |
map("--from-literal=\(.key)=\(.value)") |
join(" ")
' file1.yaml file2.yaml

命令解析

  1. 合并去重:eval-all 支持处理多个YAML文件,ireduce 从空对象开始,用*操作符依次合并每个文件的内容。由于先处理file1.yaml,其键值对会自动覆盖file2.yaml中的同名项,无需额外去重操作。
  2. 筛选目标键:to_entries 将YAML对象转换为键值对数组,select(.key | test("^FT")) 筛选出所有键以FT开头的项,自动排除非FT前缀的键。
  3. 格式化拼接:map 函数将每个键值对转换为--from-literal=键=值的格式,最后通过join(" ")将所有字符串用空格连接,生成符合要求的命令参数串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:03:28