460 Stimmen

Entfernen der letzten Zeile aus einer Datei in Bash

Ich habe eine Datei, foo.txt die die folgenden Zeilen enthält:

a
b
c

Ich möchte einen einfachen Befehl, der den Inhalt von foo.txt sein:

a
b

33voto

manpreet singh Punkte 969

Mac-Benutzer

wenn Sie nur die letzte Zeile gelöscht haben wollen, ohne die Datei selbst zu ändern, tun Sie

sed -e '$ d' foo.txt

wenn Sie die letzte Zeile der Eingabedatei selbst löschen wollen, tun Sie

sed -i '' -e '$ d' foo.txt

17voto

lhf Punkte 67202
echo -e '$d\nw\nq'| ed foo.txt

16voto

jasonleonhard Punkte 8428

Linux

$ ist die letzte Zeile, d für delete:

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

MacOS

Äquivalent des Befehls sed -i

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

14voto

Foo Bah Punkte 24553
awk 'NR>1{print buf}{buf = $0}'

Im Wesentlichen besagt dieser Code Folgendes:

Für jede Zeile nach der ersten wird die gepufferte Zeile gedruckt

für jede Zeile, den Puffer zurücksetzen

Der Puffer verzögert sich um eine Zeile, so dass am Ende die Zeilen 1 bis n-1 gedruckt werden

3voto

scottkosty Punkte 2160

Hier ist eine Lösung mit Schwamm (aus dem moreutils Paket):

head -n -1 foo.txt | sponge foo.txt

Zusammenfassung der Lösungen:

  1. Wenn Sie eine schnelle Lösung für große Dateien wünschen, verwenden Sie die effizientes Heck o dd Ansatz.

  2. Wenn Sie etwas einfach zu erweitern/zu optimieren und portabel sein wollen, verwenden Sie die umleiten und verschieben Ansatz.

  3. Wenn Sie etwas wollen, das sich leicht erweitern/verändern lässt, die Datei nicht zu groß ist, Portabilität (d. h. abhängig von moreutils Paket) ist kein Thema, et Wenn Sie ein Fan von eckigen Hosen sind, sollten Sie die Schwammmethode in Betracht ziehen.

Ein angenehmer Vorteil des Sponge-Ansatzes im Vergleich zum "Umleiten und Verschieben" ist, dass die Dateiberechtigungen erhalten bleiben.

Sponge verbraucht im Vergleich zum "Redirect and Move"-Ansatz erheblich mehr RAM. Dies bringt zwar einen kleinen Geschwindigkeitsgewinn (nur etwa 20 %), aber wenn Sie an Geschwindigkeit interessiert sind, sind die Ansätze "efficient tail" und dd die richtige Wahl.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X