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

