Wie ersetze ich mit sed/awk den GESAMTEN Text in einer Datei nach einer bestimmten Zeile durch den Inhalt einer anderen Textdatei?

Wie ersetze ich mit sed/awk den GESAMTEN Text in einer Datei nach einer bestimmten Zeile durch den Inhalt einer anderen Textdatei?

Ich versuche derzeit, die Aktualisierung des Textes einer Datei mit dem Titel original_file.txt zu automatisieren. Stellen Sie sich vor, die Datei sieht folgendermaßen aus:

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
text_that_will
be_removed
after_the_command

Diese Datei wird aktualisiert, indem der gesamte Text nach "Alles nach dieser Zeile ersetzen" entfernt und durch den Text in der Datei ersetzt wird.Ersatzdatei.txtStellen Sie sich für den Beitrag vor, dass replacement_file.txt den folgenden Text enthält:

testing123
this_is_the_replacement_text

Von dem, was ich mit sed herausgefunden habe, kann ich nur herausfinden, wie ich den Rest der Zeile nach einer bestimmten Phrase bearbeiten kann. Ich möchte den Text in original_file.txt nach der Ersetzungsphrase durch den gesamten Text aus replacement_file.txt ersetzen (ich möchte den Text der Ersetzungszeile für zukünftige Updates behalten). original_file.txt sollte am Ende so aussehen:

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text

Dank im Voraus!

Antwort1

In GNU/awk:

Benennen Sie die beiden Dateien als Argumente.

awk '{ print; } /^### REPLACE EVERYTHING AFTER THIS LINE ###$/ { nextfile; }' fn1 fn2

Antwort2

Drucken Sie alle Zeilen, bis die Zeile „Ersetzen nach“ gefunden wird. Lesen Sie dann aus einer anderen Datei und beenden Sie:

sed '/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{r replacement_file.txt
q;}' original_file.txt

  • mit sed -iÄnderungen speichern
  • oder... > tmp && mv tmp original

Antwort3

Verwendung von sed:

sed -n -e '1,/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{ p; d; }' \
       -e 'r replacement_file.txt' \
       -e 'q' original_file.txt

Die drei sedBlöcke haben folgende Funktion:

  1. Der erste Block druckt alle Zeilen von Zeile 1 bis zur Zeile mit dem speziellen Inhalt. Diese Zeilen drucke ich explizit mit pund rufe dann auf d, um den Start eines neuen Zyklus zu erzwingen (" print; next" in awk).
  2. Nachdem die ersten Zeilen vom ersten Block ausgegeben wurden, gibt der zweite Block den Inhalt der zusätzlichen Datei aus.
  3. Anschließend wird das Bearbeitungsskript beendet.

Normalerweise qwürde im dritten Block vor dem Beenden die aktuelle Zeile ausgegeben (das wäre die Zeile im Beispiel „Daten lesen text_that_will“), da aber sedmit aufgerufen wird -n, ist diese standardmäßige Ausgabe einer Zeile am Ende eines Zyklus unterbunden.

Das Ergebnis des obigen Befehls unter Berücksichtigung Ihrer Daten ist

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text

Zum Aktualisieren der Originaldatei können Sie verwenden sed -i ...oder die Ausgabe in eine neue Datei umleiten, durch die Sie dann das Original ersetzen:

sed ... original_file.txt >original_file.txt.new &&
mv original_file.txt.new original_file.txt

Antwort4

bei Verwendung von GNU Awk:

awk '{print} /### REPLACE.../{system("cat replacement"); exit 0}' file

verwandte Informationen