Ich habe eine Datei foo.txt
mit den folgenden Zeilen:
a
b
c
Ich möchte einen einfachen Befehl, der zum Inhalt des foo.txt
Seins führt:
a
b
bash
command-line
scripting
truncate
Fragsworth
quelle
quelle
sed -i
obigen Befehlsed -i '' -e '$ d' foo.txt
. Funktionierthead -n -1
derzeit auch nicht auf einem Mac.$ d
eine Regex. Es ist ein sed Befehl.d
ist der Befehl zum Löschen einer Zeile, während$
"die letzte Zeile in der Datei" bedeutet. Wenn Sie vor einem Befehl einen Ort angeben (in sed lingo als "Bereich" bezeichnet), wird dieser Befehl nur auf den angegebenen Ort angewendet. Dieser Befehl lautet also explizit "Löschen Sie im Bereich der letzten Zeile einer Datei diese". Ganz glatt und direkt auf den Punkt, wenn Sie mich fragen.Dies ist bei weitem die schnellste und einfachste Lösung, insbesondere bei großen Dateien:
Wenn Sie die oberste Zeile löschen möchten, verwenden Sie Folgendes:
Dies bedeutet, dass die Ausgangsleitungen ab Zeile 2 beginnen.
Nicht
sed
zum Löschen von Zeilen am oberen oder unteren Rand einer Datei verwenden - es ist sehr, sehr langsam, wenn die Datei groß ist.quelle
head -n -1 foo.txt
ist genugbrew install coreutils
(GNU Core Utilities) undghead
stattdessen verwendenhead
.FILE=$1; TAIL=$2; head -n -${TAIL} ${FILE} > temp ; mv temp ${FILE}
Führt sie zum Löschen 4 Zeilen zum Beispiel von Meinedat als:./TAILfixer myfile 4
natürlich zunächst durch ausführbar machenchmod +x TAILfixer
sed
ist dieser Befehl auch verdammt langsamIch hatte Probleme mit allen Antworten hier, weil ich mit einer RIESIGEN Datei (~ 300 GB) arbeitete und keine der Lösungen skaliert war. Hier ist meine Lösung:
Mit Worten: Ermitteln Sie die Länge der Datei, mit der Sie enden möchten (Länge der Datei minus Länge der Länge der letzten Zeile, mit
bc
), und legen Sie diese Position als Ende der Datei fest (indemdd
Sie ein Byte auf/dev/null
eingeben es).Dies ist schnell, da das
tail
Lesen am Ende beginnt unddd
die Datei an Ort und Stelle überschreibt, anstatt jede Zeile der Datei zu kopieren (und zu analysieren), wie dies bei den anderen Lösungen der Fall ist.HINWEIS: Dadurch wird die Zeile aus der vorhandenen Datei entfernt! Erstellen Sie ein Backup oder testen Sie eine Dummy-Datei, bevor Sie sie in Ihrer eigenen Datei ausprobieren!
quelle
Sie können verwenden, um die letzte Zeile aus einer Datei zu entfernen, ohne die gesamte Datei zu lesen oder etwas neu zu schreiben
Um die letzte Zeile zu entfernen und sie auch auf stdout zu drucken ("pop" it), können Sie diesen Befehl kombinieren mit
tee
:Diese Befehle können eine sehr große Datei effizient verarbeiten. Dies ähnelt der Antwort von Yossi und ist von dieser inspiriert, vermeidet jedoch die Verwendung einiger zusätzlicher Funktionen.
Wenn Sie diese wiederholt verwenden und Fehlerbehandlung und einige andere Funktionen wünschen, können Sie den
poptail
Befehl hier verwenden: https://github.com/donm/evenmoreutilsquelle
truncate
Ist unter OS X standardmäßig nicht verfügbar. Die Installation mit Brew ist jedoch einfach :brew install truncate
.Wenn Sie nur die letzte Zeile löschen möchten, ohne die Datei selbst zu ändern, tun Sie dies
sed -e '$ d' foo.txt
Wenn Sie die letzte Zeile der Eingabedatei selbst löschen möchten, tun Sie dies
sed -i '' -e '$ d' foo.txt
quelle
-i ''
weist sed an, die Datei an Ort und Stelle zu ändern, während ein Backup in einer Datei mit der als Parameter angegebenen Erweiterung gespeichert wird. Da der Parameter eine leere Zeichenfolge ist, wird keine Sicherungsdatei erstellt.-e
weist sed an, einen Befehl auszuführen. Der Befehl$ d
bedeutet: Finde die letzte Zeile ($
) und lösche sie (d
).Für Mac-Benutzer:
Auf dem Mac funktioniert head -n -1 nicht. Und ich habe versucht, eine einfache Lösung zu finden [ohne mir Gedanken über die Verarbeitungszeit zu machen], um dieses Problem nur mit den Befehlen "head" und / oder "tail" zu lösen.
Ich habe die folgende Befehlsfolge ausprobiert und war froh, dass ich sie nur mit dem Befehl "tail" [mit den auf dem Mac verfügbaren Optionen] lösen konnte. Wenn Sie also auf einem Mac arbeiten und nur "tail" verwenden möchten, um dieses Problem zu lösen, können Sie den folgenden Befehl verwenden:
Erklärung:
1> tail -r: kehrt einfach die Reihenfolge der Zeilen in seiner Eingabe um
2> tail -n +2: Hiermit werden alle Zeilen ab der zweiten Zeile in der Eingabe gedruckt
quelle
ghead -n -1
quelle
sed '$d'
.Im Wesentlichen sagt dieser Code Folgendes:
Drucken Sie für jede Zeile nach der ersten die gepufferte Zeile
Setzen Sie für jede Zeile den Puffer zurück
Der Puffer ist um eine Zeile verzögert, sodass Sie am Ende die Zeilen 1 bis n-1 drucken
quelle
Dieses Snippet macht den Trick.
quelle
Beide Lösungen gibt es hier in anderen Formen. Ich fand diese etwas praktischer, klarer und nützlicher:
Verwenden von dd:
Verwenden von Truncate:
quelle
Linux
$ ist die letzte Zeile, d zum Löschen:
Mac OS
Äquivalent des sed -i
quelle
So können Sie es manuell machen (ich persönlich verwende diese Methode häufig, wenn ich die letzte Zeile in einer Datei schnell entfernen muss):
Dieses
+
Zeichen bedeutet, dass beim Öffnen der Datei im vim-Texteditor der Cursor in der letzten Zeile der Datei positioniert wird.Drücken
d
Sie jetzt einfach zweimal auf Ihrer Tastatur. Dies macht genau das, was Sie wollen - entfernen Sie die letzte Zeile. Drücken Sie danach:
gefolgt vonx
und dannEnter
. Dadurch werden die Änderungen gespeichert und Sie kehren zur Shell zurück. Jetzt wurde die letzte Zeile erfolgreich entfernt.quelle
Rubin (1,9+)
quelle