Hier ist eine schöne, ordentliche Python-Lösung. Ich habe nicht versucht, hier knapp zu werden.
Dadurch wird die Datei an Ort und Stelle geändert, anstatt eine Kopie der Datei zu erstellen und die neue Zeile aus der letzten Zeile der Kopie zu entfernen. Wenn die Datei groß ist, ist dies viel schneller als die Perl-Lösung, die als beste Antwort ausgewählt wurde.
Es schneidet eine Datei um zwei Bytes ab, wenn die letzten zwei Bytes CR / LF sind, oder um ein Byte, wenn das letzte Byte LF ist. Es wird nicht versucht, die Datei zu ändern, wenn die letzten Bytes nicht (CR) LF sind. Es behandelt Fehler. Getestet in Python 2.6.
Fügen Sie dies in eine Datei mit dem Namen "striplast" und ein chmod +x striplast
.
import sys
def trunc(filename, new_len):
try:
f = open(filename, "ab")
f.truncate(new_len)
f.close()
except IOError:
print "cannot write to file:", filename
sys.exit(2)
if len(sys.argv) == 2:
filename = sys.argv[1]
else:
filename = "--help"
if filename == "--help" or filename == "-h" or filename == "/?":
print "Usage: %s <filename>" % sys.argv[0]
print "Strips a newline off the last line of a file."
sys.exit(1)
try:
f = open(filename, "rb")
except IOError:
print "file does not exist:", filename
sys.exit(2)
SEEK_EOF = 2
f.seek(-2, SEEK_EOF)
end_pos = f.tell()
line = f.read()
f.close()
if line.endswith("\r\n"):
trunc(filename, end_pos)
elif line.endswith("\n"):
trunc(filename, end_pos + 1)
PS Im Geiste von "Perl Golf" ist hier meine kürzeste Python-Lösung. Es schlürft die gesamte Datei von der Standardeingabe in den Speicher, entfernt alle Zeilenumbrüche am Ende und schreibt das Ergebnis in die Standardausgabe. Nicht so knapp wie der Perl; Sie können Perl einfach nicht für kleine knifflige schnelle Sachen wie diese schlagen.
Entfernen Sie das "\ n" aus dem Aufruf von .rstrip()
und es wird der gesamte Leerraum vom Ende der Datei entfernt, einschließlich mehrerer Leerzeilen.
Fügen Sie dies in "slurp_and_chomp.py" ein und führen Sie es aus python slurp_and_chomp.py < inputfile > outputfile
.
import sys
sys.stdout.write(sys.stdin.read().rstrip("\n"))