Aqui está uma solução Python agradável e arrumada. Não tentei ser conciso aqui.
Isso modifica o arquivo no local, em vez de fazer uma cópia do arquivo e remover a nova linha da última linha da cópia. Se o arquivo for grande, será muito mais rápido que a solução Perl que foi escolhida como a melhor resposta.
Ele trunca um arquivo em dois bytes se os últimos dois bytes forem CR / LF ou em um byte se o último byte for LF. Ele não tenta modificar o arquivo se o último byte (s) não for (CR) LF. Ele lida com erros. Testado em Python 2.6.
Coloque isso em um arquivo chamado "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 No espírito do "Perl golf", aqui está a minha solução Python mais curta. Ele retira o arquivo inteiro da entrada padrão para a memória, retira todas as novas linhas do final e grava o resultado na saída padrão. Não é tão conciso quanto o Perl; você simplesmente não pode vencer o Perl por coisas rápidas e complicadas como essa.
Remova o "\ n" da chamada .rstrip()
e removerá todo o espaço em branco do final do arquivo, incluindo várias linhas em branco.
Coloque isso em "slurp_and_chomp.py" e execute python slurp_and_chomp.py < inputfile > outputfile
.
import sys
sys.stdout.write(sys.stdin.read().rstrip("\n"))