2016-10-05 8 views
1

perl mehrzeiliges Suchen und Ersetzen mit regulärem Ausdruck

Ich habe eine Eigenschaft test.properties mit Inhalt Datei wie gezeigt:

#DEV 
#jms_value=devdata.example 
#TST 
#jms_value=tstdata.example 
#DEV 
#ems_value=emsdev.example 

ich die Zeile unter der Umgebung Namen Kommentar- will auf der Grundlage der Umgebung, in der die Datei geht.

Wenn die Datei in DEV-Umgebung geht. Ich brauche die Zeile unter der alle '#DEV' müssen unkommentiert sein. Ich habe den folgenden Befehl verwendet:

perl -i -p -e 's/#DEV\n#(.*)/#DEV\n\1/g;' test.properties 

Dies ändert nichts in der Datei.

Kann mir jemand dabei helfen, eine Lösung zu finden?

+2

die Perl Kommandozeile lesen Sie die Eingabe (eine Datei oder aus einem Rohr) Zeile für Zeile standardmäßig . Mit dieser Bedingung können Sie offensichtlich kein mehrzeiliges Muster verwenden. –

Antwort

1

Eine Möglichkeit ist, die gesamte Datei schlürfen, von perlrun doc

Der besondere Wert 00 wird Perl verursachen Dateien in Absatz Modus schlürfen. Jeder Wert von 0400 oder höher bewirkt, dass Perl ganze Dateien schlürfen kann, aber nach Konvention ist der Wert 0777 der normalerweise für diesen Zweck verwendete Wert.

Ich habe für die Demonstration leicht modifizierten Probeneingang:

$ cat ip.txt 
#DEV 
#jms_value=devdata.example 
#TST 
#jms_value=tstdata.example 
#DEV 
#ems_value=emsdev.example 
xyz #DEV 
#abc 

Hinzufügen -0777 Option OP regex

$ perl -0777 -pe 's/#DEV\n#(.*)/#DEV\n\1/g' ip.txt 
#DEV 
jms_value=devdata.example 
#TST 
#jms_value=tstdata.example 
#DEV 
ems_value=emsdev.example 
xyz #DEV 
abc 

Wenn #DEV, verwenden Sie nur am Anfang der Linie angepasst werden muss m Flagge

$ perl -0777 -pe 's/^#DEV\n#(.*)/#DEV\n\1/mg' ip.txt 
#DEV 
jms_value=devdata.example 
#TST 
#jms_value=tstdata.example 
#DEV 
ems_value=emsdev.example 
xyz #DEV 
#abc 


Positive Lookbehind können ebenfalls verwendet werden:

$ perl -0777 -pe 's/^#DEV\n\K#//mg' ip.txt 
#DEV 
jms_value=devdata.example 
#TST 
#jms_value=tstdata.example 
#DEV 
ems_value=emsdev.example 
xyz #DEV 
#abc 


Beachten Sie auch:What is the difference between \1 and $1 in a Perl regex?

0

Sie können so etwas wie dies versuchen:

perl -pe'if ($a==1) {s/^#//;$a=0;} $a=1 if (/^#DEV/)' 
1

Nur eine Variable als Flag verwenden. Wenn Sie #DEV sehen, setzen Sie es auf 1, andernfalls auf 0. Entfernen Sie die führende , wenn das Flag gesetzt ist - aber überprüfen Sie das Flag, bevor Sie es setzen!

perl -pe 's/^#// if $delete; $delete = /^#DEV$/;' input-file 
+1

Wieder @choroba bitte beschreiben Sie das Problem, dass Ihre Antwort löst. Ihr Aufwand dient nur dem OP und nur dann, wenn Ihre Analyse korrekt ist. So funktioniert Stack Overflow nicht. – Borodin

+2

@Borodin: Meine Antwort versucht, das in der Frage gestellte Problem zu lösen: Wie kann ich den Umgebungsnamen und die folgende Zeile für einen gegebenen Umgebungsnamen auskommentieren? – choroba

+0

@Borodin: Entschuldigung, es hätte "sein sollen, wie man die Zeile nach dem angegebenen Umgebungsnamen auskommentiert". – choroba

Verwandte Themen