grep의 정규 표현식

grep의 정규 표현식

매뉴얼 페이지 읽기 grep(강조)

정기적인 표현 방식
       정규식은 문자열 집합을 설명하는 패턴입니다. 정규 표현식은 다음과 같습니다.
       산술식과 유사하며, 다양한 연산자를 사용하여 결합
       더 작은 표현.

       grep정규식 구문의 세 가지 다른 버전인 "기본"(BRE),
       "확장"(ERE) 및 "perl"(PCRE). GNU에서는  grep 사용 가능한 내용에는 차이가 없습니다.
       기본 문법과 확장 문법 간의 기능.

더 아래쪽에 써있어요

   반복하다
       정규식 뒤에는 여러 반복 연산자 중 하나가 올 수 있습니다.
       ?      앞의 항목은 선택 사항이며 최대 한 번 일치할 수 있습니다.
       *      이전 항목은 0번 이상 일치합니다.
       +      이전 항목이 한 번 이상 일치합니다.
       {N}    이전 항목이 정확히 n번 일치합니다.
       {N,}   이전 항목이 n번 이상 일치합니다.
       {,}   이전 항목은 최대 m번 일치합니다. 이것은 GNU 확장입니다.
       {N,}  앞의 항목이 n번 이상 일치하지만 m번 이하로 일치합니다.

마지막 줄이 다음과 같기 때문에 GNU의 grep을 사용하고 있다고 생각합니다.

User Commands                    GNU grep 2.16                         GREP(1)  

그렇다면 $ echo aa | grep a{2}포함이 예상대로 작동하는데 왜 아무 것도 출력할 수 없습니까?-E

답변1

여기서 미묘한 점은 차이가 없지만특징, 거기차이점통사론. 특히:

  • BRE에서 {and는 }이스케이프되지 않는 한 리터럴입니다. 이 경우 수량자 표현식을 나타냅니다.

하지만

  • ERE에서 이스케이프되지 않는 한 수량자를 묶 {습니다 }. 이 경우 수량자는 리터럴입니다.

그래서

$ echo aa | grep 'a\{2\}'    # BRE
aa

$ echo aa | grep -E 'a{2}'   # ERE
aa

표현식을 따옴표로 묶지 않으면 쉘이 백슬래시를 확장하지 못하도록 백슬래시를 이스케이프 처리해야 합니다.

$ echo aa | grep a\\{2\\}    # BRE
aa

답변2

매뉴얼 페이지 아래 섹션을 참조하십시오.

기본 정규식과 확장 정규식

   In basic regular expressions the meta-characters ?, +, {, |, (, and )
   lose their special meaning; instead use the backslashed versions \?,
   \+, \{, \|, \(, and \).

관련 정보