![명령줄에서 파일 끝에 EOL이 없는지 확인](https://linux55.com/image/160854/%EB%AA%85%EB%A0%B9%EC%A4%84%EC%97%90%EC%84%9C%20%ED%8C%8C%EC%9D%BC%20%EB%81%9D%EC%97%90%20EOL%EC%9D%B4%20%EC%97%86%EB%8A%94%EC%A7%80%20%ED%99%95%EC%9D%B8.png)
파일을 열 때 파일의 vim
마지막 줄 끝에 "no"가 없으면 편집기는 이를 .EOL
[noeol]
이것을 어떻게 결정할 수 있습니까?앞으로에서 열까요 vim
? (이를 확인하기 위해 명령을 내릴 수 있습니까?)
답변1
tail -c 1
입력의 마지막 문자(보다 정확하게는 마지막 바이트)를 출력합니다.
명령 대체는 후행 줄 바꿈을 제거 $(tail -c 1 <…)
하므로비어 있는파일의 마지막 문자가 개행 문자인 경우. 마지막 문자가 널 바이트(대부분의 쉘에서)인 경우에도 널이지만 텍스트 파일에는 널 바이트가 없습니다.
빈 파일에는 추가 줄 바꿈이 필요하지 않습니다.
if [ ! -s "$filename" ]; then
echo "$filename is empty"
elif [ -z "$(tail -c 1 <"$filename")" ]; then
echo "$filename ends with a newline or with a null byte"
else
echo "$filename does not end with a newline nor with a null byte"
fi
답변2
줄 바꿈만 포함하는 파일을 만들고 파일의 마지막 바이트와 비교합니다.
printf '\n' > newline_only
tail -c 1 your_file | cmp -s newline_only -
cmp -s
나는 기본적 으로 침묵 했습니다 cmp
. 종료 상태는 0
끝에 개행 문자가 있음을 나타냅니다 your_file
.
비어 있으면 your_file
종료 상태는 입니다 1
. 당신은 예외를 두고 0
이 상황에 참여하고 싶을 수도 있습니다. 만일이 경우라면,접두사cmp
표준 입력을 통해 얻은 콘텐츠의 개행 문자:
( printf '\n'; tail -c 1 your_file ) | cmp -s newline_only -
# or
cat newline_only your_file | tail -c 1 | cmp -s newline_only -
# or better
<your_file cat newline_only - | tail -c 1 | cmp -s newline_only -
your_file
마지막 것은 존재하지 않거나 읽을 수 없는 경우 0이 아닌 종료 상태를 반환하므로 약간 더 좋습니다. 내가 당신이라면 이것을 원할 것입니다. if 는 your_file
실제로 디렉토리 then 이고 cat
실행될 것이며 다음과 같은 불만 사항을 받을 수도 있고 tail
그렇지 않을 수도 있습니다.cmp
0
cat
디렉토리는 언제 파일로 읽히지 않습니까?). 그래서 당신은 뭔가를 원할 수도 있습니다추가의논리적 OR 옵션(예: set -o pipefail
Bash).
노트:
일부 셸에서는 프로세스 대체를 사용하여 파일 생성을 방지할 수 있습니다
newline_only
. 다음과 같이 보일 것입니다:# e.g. in Bash < your_file cat <(printf '\n') - | tail -c 1 | cmp -s <(printf '\n') -
tail
파이프에서 읽을 수 없습니다. 작업을 완료하기 전에cat
전체 텍스트를 읽어야 합니다 . 아니면 내면을 들여다볼 만큼 똑똑할 수도 있습니다 . 하나 또는 몇 가지를 테스트하는 경우 이는 무시할 수 있습니다.your_file
tail
tail -c 1 your_file
<your_file tail -c 1
your_file
작은그래도 문서.- 이 다른 솔루션더 나은 성능을 발휘할 수 있습니다. 파일을 생성하지 않고,
tail
생성 하지 않으며, 많은 쉘에 있는 내장 함수를cmp
사용합니다 .[
답변3
이것 은 실제로 그것 과 아무 관련 이 없습니다 vim
. 당신이 원하는 거의
tail -c 1 file
파일의 마지막 문자를 가져옵니다.