grep/egrep과 일치하는 이상한 정규식

grep/egrep과 일치하는 이상한 정규식
  • GNU bash, 버전 4.2.46(2)-릴리스(x86_64-redhat-linux-gnu)
  • grep (GNU grep) 2.20
  • grep-2.20-3.el7.x86_64

이 퍼즐을 설명할 수 있는 사람이 있나요? grep/egrep과 잘못 일치합니다.

echo "somestringthing" | egrep  '\bstring*'
(no output as expected)
echo "somestringthing" | egrep '\bsomestring*'
somestringthing
echo "somestringthing" | egrep '\bsomestringthingy*'
somestringthing
echo "somestringthing" | egrep '\bsomestringthing1*'
somestringthing
echo "somestringthing" | egrep '\bsomestringthingX*'
somestringthing

와일드카드 앞에 문자가 있으므로 마지막 3개가 일치하면 안 됩니다. 실험 결과, 와일드카드 문자 앞에 오는 단일 문자가 없는 것처럼 모든 문자열이 일치한다는 사실을 발견했습니다.

'\b'는 참조용으로만 사용되는 단어 경계입니다.

여기서 뭔가 빠졌나요? 아니면 grep의 버그인가요? (작동하고 있다고 생각하는 코드를 디버그하려고 시도하는 미친 짓에 대해 이야기하십시오.)

답변1

마지막 세 정규식 끝에 있는 , 및 는 각각 0개 이상의 , 및 와 일치 y*합니다 1*.X*y1X

입력 문자열의 끝에는 somestringthing실제로 이러한 문자가 0개 이상 있습니다(정확히0), 세 가지 표현식이 모두 일치합니다.

맞추고 싶다면하나또는 확장 정규식을 사용하거나 기본 정규식을 사용하지 않거나 포함하지 않고 y문자열 끝에서 이상 :y+y{1,}yy*y\{1,\}grep-E

echo somestringthing | grep -E 'somestringthingy+'

(이렇게 하면 출력이 생성되지 않습니다)

또한 더 이상 사용되지 않으며 완전한 단어만 일치시키려는 경우 를 egrep사용해야 합니다 (입력에서 일치 항목의 시작과 끝 부분에 단어 경계가 필요함).grep -Egrep -E -w

답변2

휴..더 혼란스러운 점은 * 와일드카드 앞의 문자가 다음과 같이 처리되는 것 같습니다..

grep의 올바른 와일드카드 사용법은 다음과 같습니다..*뿐만 아니라*

또한 일단 \b를 사용하면 더 이상 필요하지 않습니다..*와일드카드로. -w 플래그는 예상대로 작동합니다.

echo "somestringthing" | egrep -w 'somestring.*'
somestringthing

echo "somestringthing" | egrep -w 'somestringy.*'
(no output as expected)

관련 정보