Ich muss einen großen Textblock (Shell-Script-Code) in einer Datei durch einen anderen Textblock ersetzen.
Ich bin beeindruckt von der Frage Wie kann ich sed verwenden, um eine mehrzeilige Zeichenfolge zu ersetzen? beantwortet von
antak und Multi-line replace beantwortet von Bruce Ediger
Aber ich habe einige Probleme, sie zu benutzen.
-
Antak erwähnte bereits in seiner Antwort, dass das Streamen der gesamten Datei (
1h;2,$H;$!d;g;
) in den Puffer ist für große Dateien nicht ratsam, da es den Speicher überlastet. -
Ich kenne
sed
kann mit der Blockfunktion verwendet werden, um den Text außerhalb des Blocks unverändert beizubehalten. Ich möchte diese Funktion nutzen. Aber wenn ich benutze,sed -i '/marker1/,/marker2/s/.*/new text (code)/' filename
es wird wiederholt neuen Text (Code) für jeden Stream einfügen. Daher muss ich den visuellen Block als einen Stream erstellen, indem ich etwas Ähnliches verwende, was zuvor von antak vorgeschlagen wurde, aber für den Block (nicht für die gesamte Datei).
-
Wie von Bruce Ediger erwähnt, append Feature von
ex
die mita
beginnen enden mit.
(Punkt) kann versucht werden, aber mein neuer Text (Code) enthält Zeilen, die mit Punkt beginnen, was als Punkt der Append-Syntax betrachtet werden kann. Wie kann ich es in dieser Situation verwenden? -
ex
istdd
'Anzahl der Zeilen' kann mehrere Zeilen löschen, aber wenn ich einen Block zwischen /marker1/ und /marker2/ mit nicht festgelegter (variierender) Zeilenanzahl durch neuen Text (Code) ersetzen soll, wie mache ich das?
Akzeptierte Antwort:
Ich schlage vor, das c zu verwenden hange-Befehl
(der im Wesentlichen ein d ist elete gekoppelt mit einem a ppend, obwohl das Anhängen nur für die letzte Zeile im Bereich angewendet wird, was genau das ist, was Sie hier wollen):
sed -i '/marker1/,/marker2/c
New text 1
New text 2' filename
Hier mit GNU sed
’s-Syntax für die direkte Bearbeitung (-i
). Das c
Befehl ist ansonsten Standard und portabel. GNU sed
unterstützt:
sed '/marker1/,/marker2/cNew text 1
New text 2' filename
als nicht standardmäßige Erweiterung.
Newline- und Backslash-Zeichen müssen im Ersetzungstext maskiert (mit Backslash) werden.