GNU grep은 입력에 LF 문자가 포함되어 있는지 확인합니다.

GNU grep은 입력에 LF 문자가 포함되어 있는지 확인합니다.

나는 데이터 파일 세트의 내용을 테스트하여 인쇄 가능한 문자와 인쇄되지 않는 문자로 구성된 세트에서 하나 이상의 문자가 포함되어 있는지 확인합니다.

마지막 질문은 파일에 개행 문자가 포함되어 있는지 감지하는 것입니다. 내 거GNU grep 3.0각 입력에 LF를 포함하도록 선언하세요. 왜 그럴까요?

echo -n "test" | grep -UF -e $'\x0a'

어떤 아이디어가 있나요? 암시적인 EOL/EOF 간섭이 있는 것 같습니다.

답변1

grep은 줄 지향입니다. 입력이 줄 바꿈으로 끝나지 않으면 마지막 줄 바꿈(또는 파일의 시작) 뒤의 텍스트를 줄로 처리합니다.

라인 지향 프로그램은 바이너리 파일을 직접 작업하는 데 적합하지 않습니다. 바이너리 파일에 특히 긴 "라인"이 있으면 병리학적 상태가 발생하는 경우가 많습니다.

대신 다음 tr과 같은 조합을 고려해보세요 cmp.

$ echo -n foo | tr -d -c $'\n' | cmp /dev/null - 
# no output and exits with status 0

$ echo foo | tr -d -c $'\n' | cmp /dev/null -
cmp: EOF on /dev/null which is empty
# exits with status 1

이 방법은 첫 번째 개행 문자까지만 입력(버퍼링 포함)만 읽으면 된다는 장점도 있습니다.

답변2

~에서POSIX 사양grep:

정규식 일치는 텍스트 줄을 기반으로 해야 합니다. 는 패턴 [...]을 분리하거나 종료 하므로 <newline>정규식은 를 포함할 수 없습니다 <newline>. 마찬가지로 패턴은 입력의 개별 라인(종료 문자 제외)과 일치하므로 <newline>패턴은 <newline>입력에서 발견된 것과 일치할 수 없습니다.

입력에 개행 문자(Unix에서와 동일)가 포함되어 있는지 확인하려면 다음을 사용하여 줄 수를 계산할 수 있습니다 wc -l.

lines=$( wc -l <inputfile )
if [ "$lines" -gt 0 ]; then
    echo 'Input had a linefeed character in it'
fi

또는 문자열이 있는 경우:

lines=$( printf '%s' "$string" | wc -l )
# etc.

관련 정보