繁体   English   中英

如何使用sed搜索替换文件中的多行

[英]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_filesroles:之间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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM