2016-07-20 37 views
2

Ich habe eine Datei.txt und ich muss die vorletzte Zeile der Datei löschen. Die folgenden drei sed-Befehle können die vorletzte Zeile drucken. Aber ich muss diese Zeile löschen. Irgendeine Hilfe??Löschen der vorletzten Zeile der Datei mit sed

sed -e '$!{h;d;}' -e x file.txt 

sed -n 'x;$p' file.txt 

sed 'x;$!d' file.txt 

$ cat file.txt
Apfel
Birnen
Banane
Karotte
Beere

Können wir den zweiten bis letzten Zeile einer Datei löschen:
ein. basiert nicht auf einem String/Muster.
b. basierend auf einem Muster - wenn zweiten bis letzten Zeile enthält „Karotte“

+0

Sind Optionen neben 'sed' möglich? Würden Sie beispielsweise etwas wie "Kopf" oder "Schwanz" verwenden? –

+0

# 1 wäre 'head -n -2 file.txt; tail -n 1 file.txt' –

Antwort

4

Dies könnte für Sie (GNU sed) arbeiten:

sed -i 'N;$!P;D' file 

Dadurch wird ein Fenster von zwei Zeilen in dem Musterraum und Dann druckt er den ersten, wenn der zweite nicht der letzte ist. Die letzte Zeile wird immer gedruckt, weil die nächste Zeile nicht abgerufen werden kann.

Löschen des zweiten bis letzten Zeile einer Datei auf einem Muster basiert, kann erreicht werden durch:

sed -i 'N;$!P;${/pattern.*\n/!P};D' 
+0

Potong, nur getestet, es druckt die Ausgabe ohne die vorletzte Zeile, aber die Zeile wurde nicht in der eigentlichen Datei gelöscht. – Arun

+1

@Arun müssen Sie die Option '-i' hinzufügen, um die Datei inline zu aktualisieren. Siehe Bearbeiten. – potong

+0

Potong, es funktioniert. Würdest du den Teil 'N; $! P; D' erklären können? – Arun

1

Ich weiß, dass dies eine alte Frage, aber da ich nicht das, was gesehen habe ich benutze, Ich werde es hinzufügen, falls es hilft.

sed mit tac Kombination macht dies sehr einfach:

mv file.txt file.txt.bak 
tac file.txt.bak | sed '2d' | tac > file.txt 

Dies würde den zweiten bis letzten Zeile der Datei entfernen. Es ist keine "reine" sed Lösung, und es braucht eine Zwischendatei, aber ich benutze es oft, weil IMHO es leichter zu verstehen ist.