Python实现带缩进的多YAML文件合并(指定目录场景)
实现YAML文件按指定格式合并的解决方案
你可以用一个轻量的Bash脚本来搞定这个需求——它会帮你把每个目标文件的路径作为YAML的顶级键,再把文件内容缩进后作为对应的值,完全匹配你想要的输出格式。
方法一:手动指定文件列表(精准控制)
如果你明确知道要合并的文件,直接用这个脚本最稳妥:
#!/bin/bash # 把需要合并的文件路径都列在这里,按你需要的顺序排列 target_files=( "group_vars/all.template" "host_vars/host.template" "vars/CASSANDRA" "vars/CQLSH" "vars/CSYNC2" "vars/DSE_OPSCENTER" "vars/DSE_OPSCENTER_AGENT" "vars/logging.template" "vars/packages_vars.template" "vars/UDM" "vars/user_pub_keys" ) # 生成合并后的YAML文件 for file in "${target_files[@]}"; do # 输出文件路径作为YAML键 echo "$file:" # 给文件每一行加2个空格缩进,保证YAML结构合法 sed 's/^/ /' "$file" # 每个文件之间加空行,让结果更易读 echo done > merged_vars.yaml
脚本说明:
- 先把所有要处理的文件路径放进
target_files数组里,顺序可以自己调整 - 循环遍历每个文件:
- 先输出
文件路径:作为YAML的键 - 用
sed给文件的每一行前面加两个空格,让内容成为键的子节点,符合YAML语法 - 每个文件后加空行分隔,提升可读性
- 先输出
- 最终结果会保存到
merged_vars.yaml文件中
方法二:自动查找文件(适合文件数量多的情况)
如果后续文件可能新增或变动,不想手动维护列表,可以用find命令自动匹配目标文件:
#!/bin/bash # 自动查找指定目录下的所有文件(可根据需要调整路径规则) target_files=$(find . -type f \( -path "./group_vars/*" -o -path "./host_vars/*" -o -path "./vars/*" \) | sort) # 生成合并后的YAML文件 for file in $target_files; do echo "$file:" sed 's/^/ /' "$file" echo done > merged_vars.yaml
注意事项:
- 确保所有源文件都是合法的YAML格式,否则合并后的文件可能出现语法错误
- 如果源文件开头有YAML文档分隔符
---,可以在sed命令前加sed '1d'去掉第一行(比如sed '1d' "$file" | sed 's/^/ /') - YAML标准用两个空格缩进,如果你习惯四个空格,把
sed里的改成就行
内容的提问来源于stack exchange,提问作者Heenashree Khandelwal
相关产品推荐
相关产品推荐

