Ось приємне, охайне рішення Python. Я не робив жодної спроби бути тут лася.
Це змінює файл на місці, а не робить його копію та знімає новий рядок з останнього рядка копії. Якщо файл великий, це буде набагато швидше, ніж рішення Perl, яке було обрано як найкращу відповідь.
Він обрізає файл на два байти, якщо останні два байти CR / LF, або на один байт, якщо останній байт - LF. Він не намагається змінити файл, якщо останні байти не є (CR) LF. Він обробляє помилки. Випробувано на Python 2.6.
Помістіть це у файл під назвою "striplast" і 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 В дусі "Perl golf", ось моє найкоротше рішення Python. Він перекреслює весь файл зі стандартного вводу в пам'ять, знімає всі нові рядки з кінця і записує результат на стандартний вихід. Не такий лаконічний, як Perl; ви просто не можете перемогти Perl за такі маленькі хитрі штучки, як це.
Видаліть "\ n" з виклику до, .rstrip()
і він позбавить пробілу з кінця файлу, включаючи кілька порожніх рядків.
Помістіть це у "slurp_and_chomp.py", а потім запустіть python slurp_and_chomp.py < inputfile > outputfile
.
import sys
sys.stdout.write(sys.stdin.read().rstrip("\n"))