grep: '+' 특수 문자

grep: '+' 특수 문자

grep '+' 및 '*' 특수 문자를 사용하여 몇 가지 간단한 테스트를 수행했습니다.

$ echo 'where wh+'> /tmp/toto
$ grep 'wh[e]\*' /tmp/toto
$ grep 'wh[e]*' /tmp/toto
where wh+
$ grep 'wh[e]+' /tmp/toto
$ grep 'wh+' /tmp/toto
$ grep 'wh[e]\+' /tmp/toto
where
$ grep -E 'wh[e]*' /tmp/toto
where wh+
$ grep -E 'wh[e]+' /tmp/toto
where wh+

이러한 테스트에서 확장되지 않은 grep '+'(및 '?')는 특수 문자로 해석되지 않으며 특수 문자로 사용하려면 이스케이프해야 합니다. 내가 아는 한, grep은 -E 옵션 없이 기본 정규식을 사용하며, 이 경우 특수 문자는 여기에 정의됩니다. http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03 그리고'? ' "+"는 BRE의 특수 문자가 아닙니다.

그런데 BRE에서 비특수 문자 "+"를 이스케이프하면 특수 문자가 되는 이유는 무엇입니까?

답변1

이것은 GNU 확장입니다. ~에서grep(1)맨페이지:

GNU에서는 grep기본 구문과 확장 구문 간에 사용 가능한 기능에 차이가 없습니다. 다른 구현에서는 기본 정규 표현식이 덜 강력합니다. 다음 설명은 확장 정규식에 적용됩니다. 기본 정규식과의 차이점은 나중에 요약됩니다.

더 아래로

기본 정규식과 확장 정규식

기본 정규 표현식에서는 메타 문자 ?, +, , 및 가 특별한 의미를 잃습니다. 대신 백슬래시 버전 , , , , 및 가 {사용 됩니다 .|()\?\+\{\|\(\)

답변2

제공한 POSIX 사양 링크에서 다음 내용을 읽을 수 있습니다.

일반 문자는 BRE 특수 문자에 나열된 BRE 특수 문자를 제외하고 지원되는 문자 집합의 모든 문자와 일치하는 BRE입니다.

( '\' ) 앞에 오는 일반 문자의 해석은 다음을 제외하고 정의되지 않습니다.

  • 문자 ")", "(", "{" 및 "}"
  • 숫자 1~9(포함)(여러 문자 일치하는 BRE 참조)
  • 대괄호 표현식 안의 문자

따라서 기본적으로 +이는 일반 BRE 문자이므로 동작이 grep 'x\+'지정되지 않으며 일부 구현(예: GNU)에서는 이를 grep()와 동일하게 취급하고 일부는 ()와 동일하게 취급할 수 있습니다.grep 'x\{1,\}'grep -E 'x+'grep 'x+'grep 'x\\+'

따라서 문자열을 이식 가능하게 일치시키려면 (또는 , 또는 또는 또는 ) x\+을 작성해야 합니다 .grep 'x\\+'grep 'x[\]+'grep -F 'x\+'grep -E 'x\\\+'grep -E 'x[\][+]'

답변3

위의 어떤 예가 귀하에게 정의된 행동을 위반하는 것으로 보이는지 잘 모르겠습니다.

+를 탈출해도 규칙은 변경되지 않습니다.

관련 정보