使用bash以递归方式合并yaml配置文件

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)

产生与上面相同.


Ste*_*rye 6

我建议yq -myq是 yaml 的瑞士军刀,与 jq(用于 JSON)非常相似。