ersetzen mehrere Streifenmuster in sed
Ich möchte einfach folgenden
ersetzen
EXTRATHING {
};
durch
SOMETHING {};
in der Eingabedatei. Für diese habe ich versucht
sed -e 's/EXTRATHING {\n};/SOMETHING/' input_file.txt >outfile.txt
Funktioniert das nicht. Kann jemand empfehlen, was wäre die richtige Art, dies zu tun mit sed?
Du musst angemeldet sein, um einen Kommentar abzugeben.
würde es tun.
Das problem mit diesem ist, dass es speichert die gesamten Eingabe-string in der sed-Puffer.
Sehen sed-und Multi-Line Suchen und Ersetzen für mehr Informationen und eine effizientere version.
sed
, aber Sie beschreiben auch die Nachteile. Mitse
d für die multi-line-matching mit sehr großen Dateien kann sehr teuer werden. In dieser situation (die wirklich großen Dateien), ich denke, das beste, was zu tun ist, verwenden Sie eineperl
Lösung, wie das eins durch @MasterYoda. Ich persönlich habe die änderung vorgenommen, umperl 0777
für multi-line-matching anstattsed -n
. Ich wehrte mich, es für eine Weile, aber die Vorteile sind es Wert.sed -e '/begin/,/end/{s/begin/replacement/p;d}'
begin
und Ende mitend
sind, löschen Sie Sie alle, aber für die Zeile, die enthältbegin
Strahlen Sie auchreplacement
. In Bezug auf die Frage nach der Linie wäresed -e '/EXTRATHING {/,/};/{s/EXTRATHING {/SOMETHING {};/p;d}'
getestet unter:
wenn Sie möchten, ändern Sie die Datei, inline . hinzufügen eines -i-flag.
wie :
Es ist schwierig, es zu tun in der sed, man muss schreiben tiefgestellte Zeichen.
Sie können jedoch mit einem one-liner, mit Hilfe von perl:
wo
-0777 ist record separator (endline in text-Dateien)
-p führt den Befehl für alle Dateien und druckt Sie auf dem Bildschirm
-e sagt, dass es einen ein-Zeilen-Befehl
sed
glaube ich, dass es die beste Antwort. Multi-line-matching ist nicht nur viel einfacher inperl
, aber nimmt weniger Systemressourcen.${;g;s/EXTRATHING {\n};/SOMETHING {};/g;p;}
im Antwort durch @BertrandMarron ist, was Sie nennen einen index, wenn ich das richtig verstehe. Bitte lassen Sie mich wissen, wenn dies ist, was Sie bedeutete.Könnte dies für Sie arbeiten:
oder wenn Sie möchten, Bearbeiten Sie die original-Datei:
EDIT: wie gewünscht hier ein Beispiel:
EDIT: Wenn die ersten und letzten Adressen sind aufeinander folgende Zeilen verwenden:
Einem anderen Weg (vielleicht einfacher?):
/x/,/y/
? Viel Glück an alle.