파일 끝에 개행 문자를 추가하는 방법은 무엇입니까?

파일 끝에 개행 문자를 추가하는 방법은 무엇입니까?

버전 관리 시스템을 사용할 때 diff가 이라고 말할 때 소음 때문에 짜증이 납니다 No newline at end of file.

그래서 궁금합니다: 이러한 메시지를 없애기 위해 파일 끝에 개행 문자를 어떻게 추가할 수 있습니까?

답변1

여기요:

sed -i -e '$a\' file

또는 OS X의 경우 sed:

sed -i '' -e '$a\' file

\n파일 끝에 추가 됩니다.오직이미 개행 문자로 끝나지 않은 경우. 따라서 두 번 실행하면 다른 줄 바꿈이 추가되지 않습니다.

$ cd "$(mktemp -d)"
$ printf foo > test.txt
$ sed -e '$a\' test.txt > test-with-eol.txt
$ diff test*
1c1
< foo
\ No newline at end of file
---
> foo
$ echo $?
1
$ sed -e '$a\' test-with-eol.txt > test-still-with-one-eol.txt
$ diff test-with-eol.txt test-still-with-one-eol.txt
$ echo $?
0

작동 방식:

  • $파일의 끝을 나타냅니다.
  • a\새 줄에 다음 텍스트(이 경우 아무것도 없음)를 추가합니다.

즉, 마지막 줄에 개행 문자가 아닌 문자가 포함되어 있으면 개행 문자를 추가합니다.

답변2

프로젝트를 재귀적으로 정리하려면 다음 oneliner를 사용합니다.

git ls-files -z | while IFS= read -rd '' f; do if file --mime-encoding "$f" | grep -qv binary; then tail -c1 < "$f" | read -r _ || echo >> "$f"; fi; done

설명하다:

  • git ls-files -z저장소의 파일을 나열합니다. 추가 매개변수로 선택적 모드를 사용하며, 이는 작업을 특정 파일/디렉터리로 제한하려는 경우에 유용할 수 있습니다. 대안으로 find -print0 ...또는 유사한 프로그램을 사용하여 영향을 받는 파일을 나열할 수 있습니다. 문제가 발생하는지 확인하세요.NUL- 별도의 항목입니다.

  • while IFS= read -rd '' f; do ... done항목을 반복하여 공백 및/또는 줄바꿈이 포함된 파일 이름을 안전하게 처리합니다.

  • if file --mime-encoding "$f" | grep -qv binary파일이 바이너리 형식(예: 이미지)인지 확인하고 건너뜁니다.

  • tail -c1 < "$f"파일에서 마지막 문자를 읽습니다.

  • read -r _후행 개행 문자가 누락된 경우 0이 아닌 종료 상태로 종료합니다.

  • || echo >> "$f"이전 명령의 종료 상태가 0이 아닌 경우 파일에 개행 문자를 추가합니다.

답변3

구경하다:

$ echo -n foo > foo 
$ cat foo
foo$
$ echo "" >> foo
$ cat foo
foo

그래서 그렇게 echo "" >> noeol-file해야 합니다. (또는 이러한 파일의 식별을 요청하고 싶습니다.그리고문제를 해결하시겠습니까? )

편집하다삭제됨 ( ""@yuyichao echo "" >> foo님의 댓글 참조) 편집 2다시 추가 ""(하지만@Keith Thompson의 의견 참조)

답변4

또 다른 솔루션은 다음을 사용합니다 . 이 솔루션은 마지막 행이 누락된 ed경우에만 영향을 미칩니다 .\n

ed -s file <<< w

w기본적으로 파일을 디스크에 다시 쓰는 단일 명령 인 스크립트를 통해 편집할 파일을 엽니다 . 문장을 토대로 알아낸 것입니다.ed(1)매뉴얼 페이지:

한정
       (...)

       텍스트(비바이너리) 파일이 개행으로 끝나지 않은 경우,
       그런 다음 ed는 읽고 쓸 때 하나를 추가합니다. 바이너리의 경우
       File,ed는 읽기/쓰기 시 줄 바꿈을 추가하지 않습니다.

관련 정보