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 wc
und mehreren anderen Tricks erreichen kann).
Verwenden Sie derzeit eine Problemumgehung mit head
und tail
kombiniert mit, wc
um dies zu tun. Irgendwelche schnellen Wendungen hier?
text-processing
sed
mtk
quelle
quelle
head
undtail
...head
undtail
Sie wissen von verschiedenen Geschmacksrichtungen?Antworten:
in sed
$
ist die letzte Zeile, um die letzte Zeile zu löschen:quelle
sed -i '$d' <file>
diese Option, um die Datei zu bearbeiten.$ für die letzte Zeile:
quelle
sed '$d' file; sed '$d' file
sed '$d' file
die Datei nicht; Es wird nur der Inhalt der Datei ohne die letzte Zeile ausgedruckt. Sosed '$d' file; sed '$d' file
wird der Inhalt der Datei zweimal gedruckt, jedes Mal minus der letzten Zeile. Das Äquivalent der letzten zwei Zeilen zused '$d' file
istsed '$d' file | sed '$d'
.sed -n '1{h;n;}; $q; x; p;'
. Ich schmollte, dass wir es nicht einfach tun könnensed '$-1,$d'
.cat file.txt | head -n -1 > new_file.txt
Vorsicht, so scheint es, abhängig von der letzten Zeile
file.txt
(wenn es mit endetEOF
oder\n
dannEOF
), die Anzahl der Zeilen innew_file.txt
die gleiche sein (wiefile.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.
quelle
head -n -1 file.txt > new_file.txt
. Beachten Sie jedoch, dass negative count onhead -n
nur für einige Implementierungen von verfügbar isthead
. Zum Beispiel funktioniert es nicht für FreeBSDs oder für die BusyBox-Version vonhead
.head -n -1 file.txt > new_file.txt
ist 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.)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)tail
undhead
sind Teil voncoreutils
-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.1Ich bin nicht sicher, ob RH5.5. hat bereits die Coreutils-Version, die es unterstützt. Aber 5.5 hat trotzdem EoLed.
quelle
Linux
$ ist die letzte Zeile, d zum Löschen:
Mac OS
Äquivalent zum sed -i
quelle