GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie verwendet man Sed oder Ex, um einen Block (mehrzeiliger Code) durch einen neuen Textblock (Code) zu ersetzen?

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.

  1. 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.

  2. 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).

  1. Wie von Bruce Ediger erwähnt, append Feature von ex die mit a 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?

  2. ex ist dd '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.


Linux
  1. So verwenden Sie den Sed-Befehl unter Linux mit Beispielen

  2. Wie ersetze ich eine Zeichenfolge in einer oder mehreren Dateien?

  3. Wie verwendet man Sed, um eine mehrzeilige Zeichenfolge zu ersetzen?

  4. Wie ersetze ich eine Zeichenfolge durch eine Zeichenfolge, die Slash mit Sed enthält?

  5. Kann Sed Zeilenumbrüche ersetzen?

So verwenden Sie sed zum Suchen und Ersetzen von Zeichenfolgen in Dateien

BENUTZUNG DES SED-EDITORS

Top 20 der zu verwendenden sed-Befehle

So verwenden Sie Sed zum Suchen und Ersetzen einer Zeichenfolge in einer Datei

Mehrzeilige Sed ersetzen

Wie kann man Zeichen rekursiv durch sed ersetzen?