무엇입니까? 정규 표현식을 의미합니까?


16

다음 명령은 7 자리 전화 번호를 검색하는 데 사용됩니다.

grep "[[:digit:]]\{3\}[ -]\?[[:digit:]]\{4\}" file

무엇 \?을 의미합니까?

답변:


21

마치 ?다른 많은 정규 표현식 엔진 하며 "0 또는 그 이전에 나온 것 중 하나와 일치"를 의미합니다.

귀하의 예 \?에서[ -] , 공백 또는 빼기와 일치하려고하지만 공백 또는 빼기는 선택 사항입니다.

따라서 다음 중 하나가 일치합니다.

555 1234
555-1234
5551234

그것이 \?아닌 작성 된 이유? 는 이전 버전과의 호환성을위한 .

원래 버전은 문자 그대로 물음표를 의미하는 grep"기본 정규 표현식"이라는 다른 유형의 정규 표현식 을 사용했습니다 ?.

GNU grep이 0 개 또는 1 개의 기능을 가질 수 있도록 추가했지만 \?구문 을 사용해야 스크립트를 사용했습니다.? 여전히 예상대로 작동했습니다.

grep에는 -E "확장 정규 표현식"이라는보다 일반적인 유형의 정규 표현식을 사용할 수 옵션이 있습니다.

man 1 grep:

   -E, --extended-regexp
          Interpret PATTERN as an extended regular expression
          (ERE, see below).  (-E is specified by POSIX.)

   -G, --basic-regexp
          Interpret PATTERN as a basic regular expression (BRE, see below).
          This is the default.

...

Repetition
    A regular expression may be followed by one of several repetition operators:
    ?      The preceding item is optional and matched at most once.

...

    grep understands three different versions of regular expression syntax:
    “basic,” “extended” and “perl.”

...

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

추가 정보 :


egrep명령은 동일합니다 grep -E. GNU grep 이외의 버전의 grep경우 -E옵션을 허용하거나 허용하지 egrep않을 수 있으며 별도의 프로그램 일 수 있습니다.
Keith Thompson

@KeithThompson grep -E은 공식 POSIX 방식입니다. egrep는 susv2 (1997)에서 더 이상 사용되지 않으며 POSIX 및 Unix 사양에서 susv3 (2001)에서 제거되었습니다.
Stéphane Chazelas

1
\?그래도 GNUism입니다.
Stéphane Chazelas

8

불행히도 정규 표현식의 정확한 구문은 프로그램마다 약간 씩 다릅니다. grep 정규 표현식은 sed 정규 표현식과 정확히 동일하지 않으며, 이는 Emacs 정규 표현식과 정확히 동일하지 않습니다. 의 위에. 설상가상으로 grep과 같은 "표준"도구조차 유닉스 계열 운영체제마다 약간 씩 다를 수 있습니다.

정규 표현식에서 일부 문자는 특수한 의미 (예 : 대괄호와 같은)를 가지며 백 슬래시를 앞에 두어 "이스케이프"할 때 문자 그대로의 일반 의미로 되돌립니다 (따라서 문자 그대로 대괄호는 \ [)로 작성되었습니다. 다른 사람들은 다른 방식으로 작동하며 탈출 할 때만 특별한 의미를 취합니다 (예 : 일반 n은 문자이지만 \ n은 줄 바꿈입니다). 그리고 이것들은 정규 표현식 구현마다 다를 수 있습니다.

대부분의 정규식 구현에서 물음표는 이전 항목은 선택 사항이며 이스케이프 된 물음표 (\?)는 리터럴 물음표입니다. 그러나 몇 가지 방언에서는 다른 방법입니다. 귀하의 예는 어느 쪽이든 이해가 될 수 있지만 방언 중 하나가 어디에 있습니까? 리터럴이고 \? 선택적 기호입니다. 따라서 정규 표현식은 "세 자리 숫자, 선택적으로 공백이나 대시, 네 자리 숫자"를 의미합니다.

(또 다른 단서는 \ {3 \}과 같은 구문에서 볼 수 있는데, 이는 "이전 항목의 정확히 3"을 의미하는 것입니다. 대부분의 정규식 방언에서는 {3}으로 작성되며 \ {는 문자 괄호입니다. .)


6

이것은 다른 답변에 이미 포함 된 정보에 대한 간단한 요약입니다.

에서은 grep, ?문자 그대로의 물음표 문자와 일치하고, \?의미는 제로 또는 어떤 선행 중 하나 개 발생. 따라서 귀하의 질문의 예에서 [ -]\?공백이나 하이픈 또는 아무것도 일치하지 않습니다.

에서 egrep또는 grep -E, 그것은 주변의 다른 방법이있다; \?리터럴 물음표와 일치하며 ?0 또는 1 개의 발생을 나타냅니다.

이것은 GNU grep에 적용됩니다. 비 GNU grep 구현에 대한 세부 사항은 약간 다를 수 있습니다. 특히, grep그리고 egrep역사적으로 두 개의 별도의 프로그램이었고, 나는 옛 생각하지 않는다 grepS가 있었다 -E옵션을 선택합니다. POSIX는을 지정 grep -E하지만 (나는 놀랐습니다)에 대해서는 언급하지 않았습니다 egrep.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.