
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 sed
Blöcke haben folgende Funktion:
- Der erste Block druckt alle Zeilen von Zeile 1 bis zur Zeile mit dem speziellen Inhalt. Diese Zeilen drucke ich explizit mit
p
und rufe dann aufd
, um den Start eines neuen Zyklus zu erzwingen ("print; next
" inawk
). - Nachdem die ersten Zeilen vom ersten Block ausgegeben wurden, gibt der zweite Block den Inhalt der zusätzlichen Datei aus.
- Anschließend wird das Bearbeitungsskript beendet.
Normalerweise q
wü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 sed
mit 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