Ecco una bella, ordinata soluzione Python. Non ho fatto alcun tentativo di essere conciso qui.
Ciò modifica il file sul posto, anziché creare una copia del file e rimuovere la nuova riga dall'ultima riga della copia. Se il file è di grandi dimensioni, sarà molto più veloce della soluzione Perl che è stata scelta come la migliore risposta.
Tronca un file di due byte se gli ultimi due byte sono CR / LF o di un byte se l'ultimo byte è LF. Non tenta di modificare il file se gli ultimi byte non sono (CR) LF. Gestisce errori. Testato in Python 2.6.
Mettilo in un file chiamato "striplast" e chmod +x striplast
.
#!/usr/bin/python
# strip newline from last line of a file
import sys
def trunc(filename, new_len):
try:
# open with mode "append" so we have permission to modify
# cannot open with mode "write" because that clobbers the file!
f = open(filename, "ab")
f.truncate(new_len)
f.close()
except IOError:
print "cannot write to file:", filename
sys.exit(2)
# get input argument
if len(sys.argv) == 2:
filename = sys.argv[1]
else:
filename = "--help" # wrong number of arguments so print 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:
# must have mode "b" (binary) to allow f.seek() with negative offset
f = open(filename, "rb")
except IOError:
print "file does not exist:", filename
sys.exit(2)
SEEK_EOF = 2
f.seek(-2, SEEK_EOF) # seek to two bytes before end of file
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 Nello spirito di "Perl golf", ecco la mia soluzione Python più corta. Assorbe l'intero file dallo standard input in memoria, rimuove tutte le righe dalla fine e scrive il risultato sullo standard output. Non così conciso come il Perl; semplicemente non puoi battere Perl per piccole cose veloci difficili come questa.
Rimuovere "\ n" dalla chiamata a .rstrip()
e tutto lo spazio bianco dalla fine del file, incluse più righe vuote.
Metti questo in "slurp_and_chomp.py" e poi esegui python slurp_and_chomp.py < inputfile > outputfile
.
import sys
sys.stdout.write(sys.stdin.read().rstrip("\n"))