버전 관리 시스템을 사용할 때 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는 읽기/쓰기 시 줄 바꿈을 추가하지 않습니다.