Oto ładne, uporządkowane rozwiązanie w języku Python. Nie próbowałem tu być lakoniczny.
To modyfikuje plik na miejscu, zamiast tworzyć kopię pliku i usuwać znak nowej linii z ostatniego wiersza kopii. Jeśli plik jest duży, będzie to znacznie szybsze niż rozwiązanie Perla, które zostało wybrane jako najlepsza odpowiedź.
Obcina plik o dwa bajty, jeśli ostatnie dwa bajty to CR / LF, lub o jeden bajt, jeśli ostatni bajt to LF. Nie podejmuje próby modyfikacji pliku, jeśli ostatnie bajty nie są (CR) LF. Obsługuje błędy. Przetestowano w Pythonie 2.6.
Umieść to w pliku o nazwie „striplast” i 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 W duchu „Perl golfa”, oto moje najkrótsze rozwiązanie w Pythonie. Siorbi cały plik ze standardowego wejścia do pamięci, usuwa wszystkie znaki nowej linii z końca i zapisuje wynik na standardowe wyjście. Nie tak zwięzły jak Perl; po prostu nie możesz pokonać Perla w takich drobnych, szybkich rzeczach.
Usuń znak „\ n” z wywołania do .rstrip()
i usunie cały biały znak na końcu pliku, w tym wiele pustych wierszy.
Umieść to w „slurp_and_chomp.py” i uruchom python slurp_and_chomp.py < inputfile > outputfile
.
import sys
sys.stdout.write(sys.stdin.read().rstrip("\n"))