我有多个文件
vars_files:
- "{{inventory_dir}}/common/vars/{{type1}}.yml"
- "{{inventory_dir}}/common/vars/{{type2}}.yml"
- "{{inventory_dir}}/common/vars/{{type3}}.yml"
- "{{inventory_dir}}/common/vars/{{type4}}.yml"
roles:
bla bla
线条路径可以变化,因此它不是常数
现在每次我必须手动在多个文件中进行操作。我正在寻找使用sed的东西,我可以用来替换它。
我是否有template
个文件包含我要替换的代码,如
vars_files:
- "{{inventory_dir}}/common/vars/{{type22}}.yml"
- "{{inventory_dir}}/common/vars/{{type22}}.yml"
- "{{inventory_dir}}/common/vars/{{type32}}.yml"
- "{{inventory_dir}}/common/vars/{{type42}}.yml"
然后sed在文件中找到上面的模式,并在同一位置用上面的模板替换。
我的知识只是替换多个文件中的一行代码,如
find files/ -type f -name "*.yml" -exec sed -i -re 's/\{\{inventory_dir\}\}\/vars\/common\.yml/\{\{inventory_dir\}\}\/common\/vars\/common.yml/g' {} \;
但我不知道如何处理多行。
我正在考虑在vars_files
和roles:
之间找到行,然后用模板替换,但我不知道我该怎么读
答案 0 :(得分:2)
sed用于单个行上的简单替换,即全部。对于其他任何你应该使用awk。这是未经测试的,但将非常接近您的需求:
awk '
NR==FNR { new = new $0 ORS; next }
inVF && ($1 != "-") { inVF=0 }
/vars_files:/ { inVF=1; printf "%s", new }
!inVF
' template file.yml