Voici une solution Python sympa et bien rangée. Je n'ai pas essayé d'être laconique ici.
Cela modifie le fichier sur place, plutôt que de faire une copie du fichier et de supprimer la nouvelle ligne de la dernière ligne de la copie. Si le fichier est volumineux, ce sera beaucoup plus rapide que la solution Perl qui a été choisie comme meilleure réponse.
Il tronque un fichier de deux octets si les deux derniers octets sont CR / LF, ou d'un octet si le dernier octet est LF. Il n'essaye pas de modifier le fichier si le ou les derniers octets ne sont pas (CR) LF. Il gère les erreurs. Testé en Python 2.6.
Mettez ceci dans un fichier appelé "striplast" et 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 Dans l'esprit du "Perl golf", voici ma solution Python la plus courte. Il extrait le fichier entier de l'entrée standard dans la mémoire, supprime toutes les nouvelles lignes à la fin et écrit le résultat sur la sortie standard. Pas aussi laconique que le Perl; vous ne pouvez pas battre Perl pour de petits trucs rapides et délicats comme celui-ci.
Supprimez le "\ n" de l'appel à .rstrip()
et il supprimera tous les espaces blancs à la fin du fichier, y compris plusieurs lignes vides.
Mettez ceci dans "slurp_and_chomp.py" puis exécutez python slurp_and_chomp.py < inputfile > outputfile
.
import sys
sys.stdout.write(sys.stdin.read().rstrip("\n"))