명령줄에서 파일 끝에 EOL이 없는지 확인

명령줄에서 파일 끝에 EOL이 없는지 확인

파일을 열 때 파일의 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그렇지 않을 수도 있습니다.cmp0cat디렉토리는 언제 파일로 읽히지 않습니까?). 그래서 당신은 뭔가를 원할 수도 있습니다추가의논리적 OR 옵션(예: set -o pipefailBash).

노트:

  • 일부 셸에서는 프로세스 대체를 사용하여 파일 생성을 방지할 수 있습니다 newline_only. 다음과 같이 보일 것입니다:

    # e.g. in Bash
    < your_file cat <(printf '\n') - | tail -c 1 | cmp -s <(printf '\n') -
    
  • tail파이프에서 읽을 수 없습니다. 작업을 완료하기 전에 cat전체 텍스트를 읽어야 합니다 . 아니면 내면을 들여다볼 만큼 똑똑할 수도 있습니다 . 하나 또는 몇 가지를 테스트하는 경우 이는 무시할 수 있습니다.your_filetailtail -c 1 your_file<your_file tail -c 1your_file작은그래도 문서.

  • 이 다른 솔루션더 나은 성능을 발휘할 수 있습니다. 파일을 생성하지 않고, tail생성 하지 않으며, 많은 쉘에 있는 내장 함수를 cmp사용합니다 .[

답변3

이것 은 실제로 그것 과 아무 관련 이 없습니다 vim. 당신이 원하는 거의

tail -c 1 file

파일의 마지막 문자를 가져옵니다.

관련 정보