EOF에서 여러 줄 바꿈을 제거하는 방법은 무엇입니까?

EOF에서 여러 줄 바꿈을 제거하는 방법은 무엇입니까?

내 파일은 하나 이상의 줄바꿈으로 끝나며 하나만으로 끝나야 합니다. Bash/Unix/GNU 도구를 사용하여 이 작업을 어떻게 수행할 수 있나요?

오류 파일 예:

1\n
\n
2\n
\n
\n
3\n
\n
\n
\n

수정 파일 예:

1\n
\n
2\n
\n
\n
3\n

즉, EOF와 파일의 줄 바꿈이 아닌 마지막 문자 사이에 줄 바꿈 문자가 있어야 합니다.

참조 구현

파일 내용을 읽고, 끝에 두 개의 개행 문자가 더 이상 없을 때까지 하나의 개행 문자를 자르고 다시 씁니다.

#! /bin/python

import sys

with open(sys.argv[1]) as infile:
    lines = infile.read()

while lines.endswith("\n\n"):
    lines = lines[:-1]

with open(sys.argv[2], 'w') as outfile:
    for line in lines:
        outfile.write(line)

설명: 물론 파이프가 더 우아하다면 허용됩니다.

답변1

~에서sed 유용한 한 줄 스크립트.

# Delete all trailing blank lines at end of file (only).
sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' file

답변2

awk '/^$/ {nlstack=nlstack "\n";next;} {printf "%s",nlstack; nlstack=""; print;}' file

답변3

$(< file)이제 더 적절한 도구 sed 및 awk를 사용하여 답을 얻었으므로 후행 공백 줄이 제거된다는 사실을 활용할 수 있습니다 .

a=$(<file); printf '%s\n' "$a" > file

이 저렴한 해킹은 공백이나 기타 인쇄되지 않는 문자가 포함될 수 있는 후행 빈 줄을 제거할 수 없으며 후행 빈 줄만 제거할 수 있습니다. 파일에 널 바이트가 포함된 경우에도 작동하지 않습니다.

bash 및 zsh 이외의 쉘 에서는 $(cat file).$(<file)

답변4

이 질문에는 태그가 지정되었습니다.ed, 그러나 아무도 해결책을 찾지 못했습니다 .

이것은:

ed -s file <<'ED_END'
a

.
?.?+1,$d
w
ED_END

또는 동등하게,

printf '%s\n' a '' . '?.?+1,$d' w | ed -s file

ed기본적으로 시작 시 편집 버퍼의 마지막 줄에 배치됩니다.

첫 번째 명령( a)은 버퍼 끝에 빈 줄을 추가합니다(편집 스크립트의 빈 줄은 이 줄이며 점( .)은 명령 모드로 돌아가는 데 사용됩니다).

두 번째 명령의 address( ?.?)는 무언가(공백 문자 포함)를 포함하는 가장 가까운 이전 줄을 찾은 다음 d다음 줄부터 버퍼 끝까지의 모든 것을 삭제( )합니다.

세 번째 명령( w)은 파일을 다시 디스크에 씁니다.

추가된 빈 줄은 원본 파일 끝에 빈 줄이 없으면 파일의 나머지 부분이 삭제되는 것을 방지합니다.

관련 정보