twi*_*ejr 4 bash recursion yaml
是否可以使用一些智能管道和编码,以递归方式合并yaml文件?在PHP中,我创建了一个数组(每个模块可以添加或更新系统中的/的配置节点).
目标是导出shellcript,它将所有单独的模块文件夹的配置文件合并为大合并文件.例如,它更快,更高效,客户在我们通过FTP部署新版本时不需要模块化.
它应该像PHP函数一样: array_merge_recursive
文件系统结构如下:
mod/a/config/sys.yml
mod/a/config/another.yml
mod/b/config/sys.yml
mod/b/config/another.yml
mod/c/config/totally-new.yml
sys/config/sys.yml
Run Code Online (Sandbox Code Playgroud)
配置看起来像:
date:
format:
date_regular: %d-%m-%Y
Run Code Online (Sandbox Code Playgroud)
例如,一个模块可以这样做:
date:
format:
date_regular: regular dates are boring
date_special: !!!%d-%m-%Y!!!
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有:
#!/bin/bash
#........
cp -R $dir_project/ $dir_to/
for i in $dir_project/mod/*/
do
cp -R "${i}/." $dir_to/sys/
done
Run Code Online (Sandbox Code Playgroud)
这当然会破坏循环中所有现有的配置文件..(其余的系统文件都是唯一命名的)
基本上,我需要一个用于命令行的yaml解析器,以及一个像array_merge_recursive一样的替代方法.然后一个yaml作家输出它合并.我担心我必须开始学习Python,因为bash不会在这个上削减它.
jm6*_*666 10
您可以使用例如perl.下一个oneliner:
perl -MYAML::Merge::Simple=merge_files -MYAML -E 'say Dump merge_files(@ARGV)' f1.yaml f2.yaml
Run Code Online (Sandbox Code Playgroud)
对于下一个输入文件: f1.yaml
date:
epoch: 2342342343
format:
date_regular: "%d-%m-%Y"
Run Code Online (Sandbox Code Playgroud)
f2.yaml
date:
format:
date_regular: regular dates are boring
date_special: "!!!%d-%m-%Y!!!"
Run Code Online (Sandbox Code Playgroud)
打印合并结果...
---
date:
epoch: 2342342343
format:
date_regular: regular dates are boring
date_special: '!!!%d-%m-%Y!!!'
Run Code Online (Sandbox Code Playgroud)
因为@Caleb指出模块现在只是develeloper,所以这是一个替代品.它有点长,使用两个(但通常可用)模块:
perl -MYAML=LoadFile,Dump -MHash::Merge::Simple=merge -E 'say Dump(merge(map{LoadFile($_)}@ARGV))' f1.yaml f2.yaml
Run Code Online (Sandbox Code Playgroud)
产生与上面相同.