다음은 깔끔하고 깔끔한 Python 솔루션입니다. 나는 여기에서 간결한 시도를하지 않았다.
파일 복사본을 만들고 복사본의 마지막 줄에서 줄 바꿈을 제거하는 대신 파일을 수정합니다. 파일이 크면 이것이 가장 좋은 답변으로 선택된 Perl 솔루션보다 훨씬 빠릅니다.
마지막 2 바이트가 CR / LF 인 경우 파일을 2 바이트로 자르거나 마지막 바이트가 LF 인 경우 1 바이트 씩 자릅니다. 마지막 바이트가 (CR) LF가 아닌 경우 파일 수정을 시도하지 않습니다. 오류를 처리합니다. 파이썬 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)
추신 "펄 골프"의 정신으로, 여기 제가 가장 짧은 파이썬 솔루션이 있습니다. 전체 파일을 표준 입력에서 메모리로 넘기고 모든 줄 바꿈을 끝까지 제거하고 결과를 표준 출력에 씁니다. 펄만큼 간결하지는 않다. 이런 까다로운 속임수로 펄을 이길 수는 없습니다.
호출에서 "\ n"을 제거하면 .rstrip()
여러 개의 빈 줄을 포함하여 파일 끝에서 모든 공백이 제거됩니다.
이것을 "slurp_and_chomp.py"에 넣고 실행하십시오 python slurp_and_chomp.py < inputfile > outputfile
.
import sys
sys.stdout.write(sys.stdin.read().rstrip("\n"))