So löschen Sie den gesamten Text vom Anfang einer Zeile mit einer bestimmten Zeichenfolge

So löschen Sie den gesamten Text vom Anfang einer Zeile mit einer bestimmten Zeichenfolge

Ich sed -n '/string/,$p' file >> otherfilekopiere Text aus einer Zeile mit einer bestimmten Zeichenfolge in eine andere Datei.

Nun möchte ich, dass der kopierte Text in der Originaldatei gelöscht wird. Ich habe verschiedene Methoden mit sed und awk ausprobiert, aber nichts hat funktioniert.

Wie verwende ich sed, um den Text einer Datei ab der Anfangszeile zu löschen, die eine bestimmte Zeichenfolge enthält?

texta

texta1

textb    <- string, delete rest of the text from here

textb1

textc

textc1

oder wäre Ausschneiden statt Kopieren mit sed einfacher und wie würde stattdessen der Befehl lauten?

Antwort1

Du kannstmeinen adressierten Zeilenbereich in eine neue Datei schreiben und dannDBereich löschen - der schwierige Teil besteht darin, zu verhindern, dass der dBefehl als Teil des Ausgabedateinamens behandelt wird. In GNU sed können Sie dies tun, indem Sie das Schreiben und Löschen in separate Ausdrücke aufteilen, indem Sie-e

WICHTIGER HINWEIS: Dadurch wird abgeschnitten otherfile, anstatt angehängt

sed -i.bak -e '/string/,${w otherfile' -e 'd;}' file

Antwort2

Oder verwenden Sie ed!

ed -s file <<< $'/textb/,$w otherfile\n/textb/,$d\nw\nq'

Angesichts Ihrer EingabeDateivon:

texta

texta1

textb    <- string, delete rest of the text from here

textb1

textc

textc1

Nach der Ausführung des edBefehlsDateiwird:

texta

texta1

(am Ende gibt es eine leere Zeile, die hier in der Formatierung verschwindet); undandereDateienthält:

textb    <- string, delete rest of the text from here

textb1

textc

textc1

Die edBefehle sind:

  • /textb/,$w otherfile-- schreibe diesen Zeilenbereich aufandereDatei
  • /textb/,$d-- diesen Zeilenbereich löschen
  • w-- die geänderte Datei auf die Festplatte schreiben
  • q-- beendet

Antwort3

Wenn Sie diesen Befehl verwenden sed -n '/string/,$p' file >> otherfile, um alle Zeilen aus der einenenthaltend stringzum Ende der Datei ( $) in eine Otherfile-Datei.

Der einfachste Weg, das Komplement davon zu extrahieren, besteht darin, die Übereinstimmung zu ergänzen:

sed '/string/,$d' file >> someOtherDifferentFile

Und wenn Sie die Originaldatei aktualisieren möchten/müssen, kopieren Sie das Ergebnis einfach zurück.

Dies ist, was die -iOption für sed bewirkt. Dadurch wird die Originaldatei aktualisiert:

sed -i.bak '/string/,$d' file

verwandte Informationen