![정규식 시작 부분의 "*"는 무엇을 합니까?](https://linux55.com/image/85840/%EC%A0%95%EA%B7%9C%EC%8B%9D%20%EC%8B%9C%EC%9E%91%20%EB%B6%80%EB%B6%84%EC%9D%98%20%22*%22%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9D%84%20%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
이 예에서는 다음과 같이 설명합니다. 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 표준.
grep
OpenBSD 6.4에서는 다음 과 같은 일이 발생합니다.
$ grep -E '*hello'
grep: repetition-operator operand invalid
GNU는 다음 grep
을 완전히 무시하는 것 같습니다 *
.
$ printf 'hello\n' | ggrep -E '*hello'
hello
~에 따르면동일한 표준, 기본 정규 표현식( grep
없이 -E
) 을 사용하는 경우 *
표현식 또는 하위 표현식의 시작 \(...\)
(또는 첫 번째 문자 바로 뒤 ^
)은 다음과 같습니다.문자 그대로 해석됨*
.