파일이 개행 문자로 끝나는 것을 감지하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/38746

  •  09-06-2019
  •  | 
  •  

문제

종료 시간 Subversion을 수행할 때 텍스트 파일을 수정할 수 있습니까? 승인하다 대신 커밋을 차단할 것을 제안했습니다.

그러나 파일이 개행 문자로 끝나는지 확인하는 방법을 모르겠습니다.파일이 줄바꿈으로 끝나는 것을 어떻게 감지할 수 있나요?

도움이 되었습니까?

해결책

@콘라드:tail은 빈 줄을 반환하지 않습니다.나는 줄바꿈으로 끝나지 않는 텍스트가 있는 파일과 개행으로 끝나는 파일을 만들었습니다.tail의 출력은 다음과 같습니다.

$ cat test_no_newline.txt
this file doesn't end in newline$ 

$ cat test_with_newline.txt
this file ends in newline
$

tail에 마지막 바이트 옵션이 있다는 것을 알았습니다.그래서 스크립트를 다음과 같이 수정했습니다.

#!/bin/sh
c=`tail -c 1 $1`
if [ "$c" != "" ]; then echo "no newline"; fi

다른 팁

아니면 더 간단합니다:

#!/bin/sh
test "$(tail -c 1 "$1")" && echo "no newline at eof: '$1'"

그러나 보다 강력한 검사를 원한다면 다음을 수행하십시오.

test "$(tail -c 1 "$1" | wc -l)" -eq 0 && echo "no newline at eof: '$1'"

유용한 bash 기능은 다음과 같습니다.

function file_ends_with_newline() {
    [[ $(tail -c1 "$1" | wc -l) -gt 0 ]]
}

다음과 같이 사용할 수 있습니다.

if ! file_ends_with_newline myfile.txt
then
    echo "" >> myfile.txt
fi
# continue with other stuff that assumes myfile.txt ends with a newline

다음과 같은 것을 커밋 전 스크립트로 사용할 수 있습니다.

#! /usr/bin/perl

while (<>) {
    $last = $_;
}

if (! ($last =~ m/\n$/)) {
    print STDERR "File doesn't end with \\n!\n";
    exit 1;
}

나를 위해 일했습니다 :

tail -n 1 /path/to/newline_at_end.txt | wc --lines
# according to "man wc" : --lines - print the newline counts

그래서 wc는 개행 문자의 수를 계산합니다. 이는 우리의 경우에는 좋습니다.oneliner는 파일 끝에 개행 문자가 있는지에 따라 0 또는 1을 인쇄합니다.

만 사용 bash:

x=`tail -n 1 your_textfile`
if [ "$x" == "" ]; then echo "empty line"; fi

(공백을 올바르게 복사하도록 주의하세요!)

@grom:

tail은 빈 줄을 반환하지 않습니다

젠장.내 테스트 파일이 다음 날짜에 끝나지 않았습니다. \n 하지만 \n\n.보기에 vim 다음 날짜로 끝나지 않는 파일을 만들 수 없습니다. \n (?).어쨌든, "마지막 바이트 가져오기" 옵션이 작동하는 한 모든 것이 정상입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top