如何使用sed

时间:2016-08-29 23:43:54

标签: regex linux bash awk 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:之间找到行,然后用模板替换,但我不知道我该怎么读

1 个答案:

答案 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