나는 데이터 파일 세트의 내용을 테스트하여 인쇄 가능한 문자와 인쇄되지 않는 문자로 구성된 세트에서 하나 이상의 문자가 포함되어 있는지 확인합니다.
마지막 질문은 파일에 개행 문자가 포함되어 있는지 감지하는 것입니다. 내 거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.