정규식 시작 부분의 "*"는 무엇을 합니까?

정규식 시작 부분의 "*"는 무엇을 합니까?

이 예에서는 다음과 같이 설명합니다. find(GNU findutils) 4.5.11 grep(GNU grep) 2.20

여러 파일이 포함된 디렉토리가 있다고 가정해 보겠습니다. jtobdops02.key 및 jtobdops.02.cer이라는 파일을 찾고 싶습니다.

find . -regextype posix-extended -regex ".*jtobdops02\.(key|cer)"

다음을 제공합니다:

./certs/jtobdops02.key

./certs/jtobdops02.cer

find . -type f | grep -E '.*jtobdops02.*(key|cer)'

또한 예상대로 제공됩니다.

./certs/jtobdops02.key

./certs/jtobdops02.cer

하지만

find . -type f | grep -E '*jtobdops02.*(key|cer)'

이것을 고려하면:

./자격증/jtobdops02.key

./자격증/jtobdops02.cer

발견자는 다음과 같이 지적했습니다.

This is a match on the whole path, not a search.

grep의 남자는 이렇게 말합니다.

grep, egrep, fgrep - print lines matching a pattern

둘 다 검색 대신 일치를 수행하는 경우 왜 후자의 grep이 여전히 작동합니까? 또한 후자의 경우 grep에는 일치하는 선행 하위 표현식이 없으므로 *이 경우 무엇과 일치합니까? 컬러(굵게) 출력에는 아무런 차이가 표시되지 않으므로 아무 작업도 수행하지 않는 것으로 가정합니다. 이 경우 오류가 보고되어야 하지 않나요?

다음 중 특성은 무엇이며 다른 도구 및 언어에서 일반적인 관행은 무엇입니까?

답변1

an으로 시작하는 확장 정규식은 *다음을 생성합니다.정의되지 않은 결과, 에 따르면POSIX 표준.

grepOpenBSD 6.4에서는 다음 과 같은 일이 발생합니다.

$ grep -E '*hello'
grep: repetition-operator operand invalid

GNU는 다음 grep을 완전히 무시하는 것 같습니다 *.

$ printf 'hello\n' | ggrep -E '*hello'
hello

~에 따르면동일한 표준, 기본 정규 표현식( grep없이 -E) 을 사용하는 경우 *표현식 또는 하위 표현식의 시작 \(...\)(또는 첫 번째 문자 바로 뒤 ^)은 다음과 같습니다.문자 그대로 해석됨*.

관련 정보