2016-08-29 6 views
0

Ich habe diese in mehreren DateienWie suchen kann mehrere Zeilen in einer Datei mit sed ersetzen

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 

Der Weg Linien sein Nun, da jedes Mal variieren kann ich chnage in mehrer so nicht konstant

habe Dateien von Hand. Ich suchte nach etwas mit sed, das ich ersetzen kann.

Ist es möglich, dass ich template-Datei, die den Code enthält, die i wie

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" 

ersetzen wollen Dann sed über Muster in Dateien finden und mit oben Vorlage an derselben Stelle ersetzen.

Mein sed Wissen ist nur eine einzige Codezeile in mehreren Dateien zu ersetzen, wie

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

Aber ich bin nicht sicher, wie kann ich mit mehreren Linien zu tun.

ich von findinglines mit Vorlage denke zwischen vars_files und roles: und dann ersetzen, aber ich bin nicht sicher, wie kann ich lesen, dass

+1

Haben Sie nach '[sed] multiline replace' gesucht? Es gibt 99 Q/As für dieses aber es ist wirklich eine zerbrechliche Lösung für Ihr Problem. Nicht empfohlen. Sie werden sicherlich Alternativen finden, die durch einige der anderen Q/As hier lesen. Viel Glück. – shellter

Antwort

2

sed für einfache Substitutionen an einzelnen Linien ist, das ist alles. Für alles andere solltest du awk verwenden. Dies ist nicht getestet, wird aber sehr nahe an dem sein, was Sie brauchen:

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