답변:
마치 ?
다른 많은 정규 표현식 엔진 하며 "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 \).
추가 정보 :
grep -E
옵션 및 egrep
grep -E
은 공식 POSIX 방식입니다. egrep
는 susv2 (1997)에서 더 이상 사용되지 않으며 POSIX 및 Unix 사양에서 susv3 (2001)에서 제거되었습니다.
\?
그래도 GNUism입니다.
불행히도 정규 표현식의 정확한 구문은 프로그램마다 약간 씩 다릅니다. grep 정규 표현식은 sed 정규 표현식과 정확히 동일하지 않으며, 이는 Emacs 정규 표현식과 정확히 동일하지 않습니다. 의 위에. 설상가상으로 grep과 같은 "표준"도구조차 유닉스 계열 운영체제마다 약간 씩 다를 수 있습니다.
정규 표현식에서 일부 문자는 특수한 의미 (예 : 대괄호와 같은)를 가지며 백 슬래시를 앞에 두어 "이스케이프"할 때 문자 그대로의 일반 의미로 되돌립니다 (따라서 문자 그대로 대괄호는 \ [)로 작성되었습니다. 다른 사람들은 다른 방식으로 작동하며 탈출 할 때만 특별한 의미를 취합니다 (예 : 일반 n은 문자이지만 \ n은 줄 바꿈입니다). 그리고 이것들은 정규 표현식 구현마다 다를 수 있습니다.
대부분의 정규식 구현에서 물음표는 이전 항목은 선택 사항이며 이스케이프 된 물음표 (\?)는 리터럴 물음표입니다. 그러나 몇 가지 방언에서는 다른 방법입니다. 귀하의 예는 어느 쪽이든 이해가 될 수 있지만 방언 중 하나가 어디에 있습니까? 리터럴이고 \? 선택적 기호입니다. 따라서 정규 표현식은 "세 자리 숫자, 선택적으로 공백이나 대시, 네 자리 숫자"를 의미합니다.
(또 다른 단서는 \ {3 \}과 같은 구문에서 볼 수 있는데, 이는 "이전 항목의 정확히 3"을 의미하는 것입니다. 대부분의 정규식 방언에서는 {3}으로 작성되며 \ {는 문자 괄호입니다. .)
이것은 다른 답변에 이미 포함 된 정보에 대한 간단한 요약입니다.
에서은 grep
, ?
문자 그대로의 물음표 문자와 일치하고, \?
의미는 제로 또는 어떤 선행 중 하나 개 발생. 따라서 귀하의 질문의 예에서 [ -]\?
공백이나 하이픈 또는 아무것도 일치하지 않습니다.
에서 egrep
또는 grep -E
, 그것은 주변의 다른 방법이있다; \?
리터럴 물음표와 일치하며 ?
0 또는 1 개의 발생을 나타냅니다.
이것은 GNU grep에 적용됩니다. 비 GNU grep 구현에 대한 세부 사항은 약간 다를 수 있습니다. 특히, grep
그리고 egrep
역사적으로 두 개의 별도의 프로그램이었고, 나는 옛 생각하지 않는다 grep
S가 있었다 -E
옵션을 선택합니다. POSIX는을 지정 grep -E
하지만 (나는 놀랐습니다)에 대해서는 언급하지 않았습니다 egrep
.
egrep
명령은 동일합니다grep -E
. GNU grep 이외의 버전의grep
경우-E
옵션을 허용하거나 허용하지egrep
않을 수 있으며 별도의 프로그램 일 수 있습니다.