
Ich sed -n '/string/,$p' file >> otherfile
kopiere 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 d
Befehl 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 ed
BefehlsDateiwird:
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 ed
Befehle sind:
/textb/,$w otherfile
-- schreibe diesen Zeilenbereich aufandereDatei/textb/,$d
-- diesen Zeilenbereich löschenw
-- die geänderte Datei auf die Festplatte schreibenq
-- beendet
Antwort3
Wenn Sie diesen Befehl verwenden sed -n '/string/,$p' file >> otherfile
, um alle Zeilen aus der einenenthaltend string
zum 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 -i
Option für sed bewirkt. Dadurch wird die Originaldatei aktualisiert:
sed -i.bak '/string/,$d' file