Aquí hay una buena y ordenada solución de Python. No hice ningún intento de ser conciso aquí.
Esto modifica el archivo en el lugar, en lugar de hacer una copia del archivo y quitar la nueva línea de la última línea de la copia. Si el archivo es grande, será mucho más rápido que la solución Perl elegida como la mejor respuesta.
Trunca un archivo en dos bytes si los dos últimos bytes son CR / LF, o en un byte si el último byte es LF. No intenta modificar el archivo si los últimos bytes no son (CR) LF. Maneja errores. Probado en Python 2.6.
Ponga esto en un archivo llamado "striplast" y 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)
PD: En el espíritu del "Perl golf", aquí está mi solución Python más corta. Extrae todo el archivo de la entrada estándar a la memoria, elimina todas las líneas nuevas del final y escribe el resultado en la salida estándar. No tan conciso como el Perl; simplemente no puedes vencer a Perl por pequeñas cosas rápidas como esta.
Elimine el "\ n" de la llamada .rstrip()
y eliminará todo el espacio en blanco desde el final del archivo, incluidas varias líneas en blanco.
Pon esto en "slurp_and_chomp.py" y luego ejecuta python slurp_and_chomp.py < inputfile > outputfile
.
import sys
sys.stdout.write(sys.stdin.read().rstrip("\n"))