[英]How can search replace multiple lines in a file using sed
我有多个文件
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:
之间vars_files
roles:
然后替换为模板,但是我不确定该如何阅读
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.