-o 사용 시 GNU/macOS grep 출력 차이 난독화

-o 사용 시 GNU/macOS grep 출력 차이 난독화

grepmacOS의 BSD가 여기서 첫 번째 단어만 생성하는 이유는 무엇입니까 ?

$ echo "once upon a time" | grep -o "[a-z]*"
once

그러나 여기에 모든 단어가 있습니다.

$ echo "once upon a time" | grep -o "[a-z][a-z]*"
once
upon
a
time

또는 확장 정규식을 사용하세요.

$ echo "once upon a time" | grep -E -o "[a-z]*"
once

$ echo "once upon a time" | grep -E -o "[a-z]+"
once
upon
a
time

GNU는 (또는 ) 및 다음에 대해 동일한 출력을 생성 grep합니다 .[a-z]+[a-z][a-z]*[a-z]*

$ echo "once upon a time" | ggrep -E -o "[a-z]*"
once
upon
a
time

$ echo "once upon a time" | ggrep -E -o "[a-z]+"
once
upon
a
time

답변1

주석 섹션에서 생각을 모으는 것은 다양한 구현이 빈 문자열에 대한 grepnull 일치 및 표현식 일치를 처리하기로 결정하는 방식에 달려 있는 것 같습니다 .[a-z]*

-o옵션은 POSIX에 의해 정의되지 않으므로 구현 방식을 처리하는 방법은 개발자에게 달려 있습니다.

GNU는 사용 시 빈 문자열 뒤에 오는 것과 grep같은 빈 일치 항목을 분명히 삭제하고 다음 문자부터 시작하여 입력을 계속 처리합니다.once[a-z]*

BSD는 grep빈 성냥을 치고 어떤 이유로든 그것으로 충분하다고 결정하고 거기에서 멈추는 것 같습니다.

ast-openStéphane은 버전이 실제로 grep빈 일치 항목에서 무한 루프에 들어가고 문자열의 해당 지점을 넘지 않는다고 언급했습니다 .[a-z]*once

OpenBSD는 플래그를 추가하면(일치 항목을 단어 경계로 구분해야 함) 각 단어가 개별적으로 반환된다는 점에서 grepmacOS 및 FreeBSD와 다른 것으로 보입니다 .grep-w[a-z]*

ilkkachu는 -o빈 문자열 일치를 허용하는 패턴이 허용된다는 점에서 혼란스러운(또는 적어도 모호한) 것을 관찰했습니다. 빈 일치 항목을 모두 인쇄해야 합니까? 실제로, 주어진 문자열의 모든 단어 뒤에는 그러한 일치 항목이 무한히 많이 나옵니다.


OpenBSD 소스 코드 grep(macOS와 동일한 동작을 나타냄 grep)에는 다음이 포함되어 있습니다.src/usr.bin/grep/util.c):

               if (r == 0) {
                        c = 1;
                        if (oflag && pmatch.rm_so != pmatch.rm_eo)
                                goto print;
                        break;
                }
        }
        if (oflag)
                return c;
print:

이는 기본적으로 패턴이 ( )와 일치하고 ( )를 r == 0사용하고 일치 시작 오프셋이 일치 끝 오프셋( , 즉 빈 일치)과 동일한 경우 일치 결과는 다음과 같습니다.-ooflagpmatch.rm_so == pmatch.rm_eo아니요인쇄하면 이 특정 입력 줄에 대한 일치가 종료됩니다( "일치 항목 발견"을 return c의미 ).c == 1

관련 정보