Letzte Zeile aus der Datei löschen

44

Ich benutze sed , um Zeilen mit einer bestimmten Position als schnell zu löschen

sed '1d'
sed '5d'

Aber was ist, wenn ich die letzte Zeile der Datei löschen möchte und die Anzahl der Zeilen nicht weiß (ich weiß, dass ich das mit wcund mehreren anderen Tricks erreichen kann).

Verwenden Sie derzeit eine Problemumgehung mit headund tailkombiniert mit, wcum dies zu tun. Irgendwelche schnellen Wendungen hier?

mtk
quelle
Welches Betriebssystem? Einige Aromen haben interessante Optionen für headund tail...
Nils
@Nils Ich bin auf 'Red Hat Enterprise Linux Server Version 5.5 (Tikanga)'. Können Sie auf die Optionen für headund tailSie wissen von verschiedenen Geschmacksrichtungen?
MTK
Ich tat. Siehe unten.
Nils

Antworten:

87

in sed $ist die letzte Zeile, um die letzte Zeile zu löschen:

sed '$d' <file>
h3rrmiller
quelle
12
Verwenden Sie sed -i '$d' <file>diese Option, um die Datei zu bearbeiten.
WanderingMind
1
Was wäre zum Löschen der letzten n Zeilen, wobei n eine Ganzzahl ist?
Joshua Salazar
31

$ für die letzte Zeile:

sed '$d' file
Guru
quelle
9
schlagen Sie um 30 Sekunden: P
h3rrmiller
1
Leider muss man komplexere Techniken anwenden, um beispielsweise die letzten beiden Zeilen zu löschen.
dubiousjim
Was meinst du? sed '$d' file; sed '$d' file
Rob
3
@Rob: Ändert sed '$d' filedie Datei nicht; Es wird nur der Inhalt der Datei ohne die letzte Zeile ausgedruckt. So sed '$d' file; sed '$d' filewird der Inhalt der Datei zweimal gedruckt, jedes Mal minus der letzten Zeile. Das Äquivalent der letzten zwei Zeilen zu sed '$d' fileist sed '$d' file | sed '$d'.
Ruakh
2
Ja, das ist unelegant, aber natürlich funktioniert es. Ich würde es in einem Durchgang mit tun sed -n '1{h;n;}; $q; x; p;'. Ich schmollte, dass wir es nicht einfach tun können sed '$-1,$d'.
dubiousjim
14

cat file.txt | head -n -1 > new_file.txt

Vorsicht, so scheint es, abhängig von der letzten Zeile file.txt(wenn es mit endet EOFoder \ndann EOF), die Anzahl der Zeilen innew_file.txt die gleiche sein (wie file.txt) nach diesem Befehl ein (dies geschieht , wenn es nicht ist \n) - in jedem Fall, Der Inhalt der letzten Zeile wird gelöscht.

Beachten Sie außerdem, dass Sie eine zweite (Zwischen-) Datei verwenden müssen. Wenn Sie in dieselbe Datei umleiten, wird diese gelöscht.

Emanuel Berg
quelle
6
Wo dies funktioniert, könnte es auch einfach sein head -n -1 file.txt > new_file.txt. Beachten Sie jedoch, dass negative count on head -nnur für einige Implementierungen von verfügbar ist head. Zum Beispiel funktioniert es nicht für FreeBSDs oder für die BusyBox-Version von head.
dubiousjim
1
@dubiousjim: Einverstanden, head -n -1 file.txt > new_file.txtist besser. Dies funktioniert in Bezug auf meine beiden Kommentare genauso (gleiche Anzahl von Zeilen und Löschen in derselben Datei). Was das negative Argument betrifft, so treten solche Unterschiede zwischen Unixes von Zeit zu Zeit auf, und sie sind oft frustrierend, weil Sie davon ausgehen, dass es sich um denselben Befehl handelt (und warum würden Sie nicht - den gleichen Namen und Zweck!) - auf jeden Fall gut Punkt. (Ich benutze Debian.)
Emanuel Berg
5

head --lines=-1. Ich bin zum ersten Mal auf diese Möglichkeit in der Manpage für head auf einem SLES11SP2-System gestoßen (coreutils-8.12-6.23.1)

tailund headsind Teil von coreutils-rpm (zumindest für rpm-basierte Systeme).

Laut dem Änderungsprotokoll von coreutils wird diese Syntax seit coreutils-Version 5.0.1 unterstützt

Schlechte Nachricht: Laut RH5-Manpage wird diese Option nicht beschrieben

Gute Nachricht: Es funktioniert mit RH5 (also in Ihrem Fall: es funktioniert - zumindest mit einer aktuellen Version von RH5).

rpm -q coreutils zeigt mir (unter CentOS 5.8): coreutils-5.97-34.el5_8.1

Ich bin nicht sicher, ob RH5.5. hat bereits die Coreutils-Version, die es unterstützt. Aber 5.5 hat trotzdem EoLed.

Nils
quelle
+1. es funktioniert perfekt auf RH5.5. Vielen Dank.
MTK
0

Linux

$ ist die letzte Zeile, d zum Löschen:

sed '$d' ~/path/to/your/file/name

Mac OS

Äquivalent zum sed -i

sed -i '' -e '$ d' ~/path/to/your/file/name
jasonleonhard
quelle