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
위의 어떤 예가 귀하에게 정의된 행동을 위반하는 것으로 보이는지 잘 모르겠습니다.
+를 탈출해도 규칙은 변경되지 않습니다.