grep
macOS의 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
주석 섹션에서 생각을 모으는 것은 다양한 구현이 빈 문자열에 대한 grep
null 일치 및 표현식 일치를 처리하기로 결정하는 방식에 달려 있는 것 같습니다 .[a-z]*
이 -o
옵션은 POSIX에 의해 정의되지 않으므로 구현 방식을 처리하는 방법은 개발자에게 달려 있습니다.
GNU는 사용 시 빈 문자열 뒤에 오는 것과 grep
같은 빈 일치 항목을 분명히 삭제하고 다음 문자부터 시작하여 입력을 계속 처리합니다.once
[a-z]*
BSD는 grep
빈 성냥을 치고 어떤 이유로든 그것으로 충분하다고 결정하고 거기에서 멈추는 것 같습니다.
ast-open
Stéphane은 버전이 실제로 grep
빈 일치 항목에서 무한 루프에 들어가고 문자열의 해당 지점을 넘지 않는다고 언급했습니다 .[a-z]*
once
OpenBSD는 플래그를 추가하면(일치 항목을 단어 경계로 구분해야 함) 각 단어가 개별적으로 반환된다는 점에서 grep
macOS 및 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
사용하고 일치 시작 오프셋이 일치 끝 오프셋( , 즉 빈 일치)과 동일한 경우 일치 결과는 다음과 같습니다.-o
oflag
pmatch.rm_so == pmatch.rm_eo
아니요인쇄하면 이 특정 입력 줄에 대한 일치가 종료됩니다( "일치 항목 발견"을 return c
의미 ).c == 1