简体   繁体   中英

How can search replace multiple lines in a file using sed

I have this in multiple files

  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

The lines path can vary so its not constant

Now every time i have to chnage that in multiple files by hand. I was lokking for something using sed which i can use to replace.

Is it possible that i have template file which contain the code which i want to replace like

  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"

Then sed find above patterns in files and replace with above template at same location.

My sed knowledge is only to replace some one line of code in multiple files like

find files/ -type f -name "*.yml" -exec sed -i -re 's/\{\{inventory_dir\}\}\/vars\/common\.yml/\{\{inventory_dir\}\}\/common\/vars\/common.yml/g' {} \;

But i am not sure how can i do with multiple lines.

I am thinking of findinglines between vars_files and roles: and then replace with template but i am not sure how can i read that

sed is for simple substitutions on individual lines, that is all. For anything else you should be using awk. This is untested but will be very close to what you need:

awk '
NR==FNR { new = new $0 ORS; next }
inVF && ($1 != "-") { inVF=0 }
/vars_files:/ { inVF=1; printf "%s", new }
!inVF
' template file.yml

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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