it-swarm.com.de

So löschen Sie bestimmte Zeilen aus einer txt-Datei

Ich habe ein Bash-Skript, das Daten in eine Protokolldatei schreibt, und dann entnehme ich mit dem Befehl sed die gewünschten Daten. Das gibt mir eine Datei data.txt. Ich möchte wissen, wie ich bestimmte Zeilen in dieser data.txt -Datei lösche.

Zum Beispiel:

123
456
789

Ich möchte die 2. Zeile entfernen, die 456 enthält, damit ich nur habe

123

789

Ich habe es mit sed '2d' data.txt versucht, aber es funktioniert nicht.

Ich benutze diesen Befehl, um data.txt aus log.log zu erstellen:

sed -nE '1s/.{1}(.{2}).*/\1/p;' log.log >> data.txt
4
Insanebench420

Versuche dies. Das sollte funktionieren.

sed -i '2d' data.txt

Sie müssen das Flag -i mit dem Befehl sed hinzufügen, es sei denn, Sie leiten Ihre Ausgabe in eine neue Datei um. Wenn Sie das Flag -i nicht hinzufügen, druckt sed den Musterbereich in STDOUT und nimmt keine Änderungen an der Originaldatei vor.

Automatische Sicherungsoption

Es ist sehr gefährlich, eine Datei zu ändern, ohne eine ordnungsgemäße Sicherung zu erstellen. Also hat sed seine native Methode, um eine Datei vor der Bearbeitung zu sichern. Dies ist die Option -i.bak.

Wenn wir also im obigen Beispiel die Sicherungsoption verwenden, lautet der Befehl.

sed -i.bak '2d' data.txt

Dadurch wird die erste Zeile aus der Datei data.txt entfernt und eine Sicherungskopie der Originaldatei mit der Erweiterung .bak erstellt.

7
ran

Sie wissen, dass Sie neben der Angabe der Zeilennummer auch den Inhalt der Zeile abgleichen können, wenn dies nützlicher ist (was sich vielleicht so anhört):

sed -i '/^456$/d' data.txt
6
JoL

awk verwenden:

awk 'NR!=2{ print }' input-file > output-file

Dies könnte folgendermaßen lauten: Wenn die Anzahl der Datensätze ungleich 2 ist, drucken Sie den Datensatz (Zeile). Wenn Sie die zweite und dritte Zeile löschen möchten:

awk 'NR!=2 && NR!=3 { print }' input-file

Wenn Sie eine leere Zeile haben möchten, wie in der Frage gezeigt, sollte der Befehl sed folgendermaßen aussehen:

 sed '2 s/^.*$//' input-file

Das erste Zeichen 2 ist die Nummer der Zeile, gefolgt vom Befehl s, der alle Zeichen .* vom Anfang ^ bis zum Ende $ der Zeile durch eine leere Zeichenfolge // ersetzt. In diesem Fall können das Anfangs- und das Endzeichen weggelassen werden.

Beispiel:

$ cat input-file
123
456
789
654

$ sed '2,3 s/.*//' input-file
123


654
3
pa4080

Dieser Befehl löscht die Zeilen 2-4 und 6

sed -e '2,4d;6d' file
2
Petr