7자리 전화번호를 검색하려면 다음 명령을 사용합니다.
grep "[[:digit:]]\{3\}[ -]\?[[:digit:]]\{4\}" file
\?
무엇을 나타내는가?
답변1
다른 많은 정규식 엔진과 마찬가지로 ?
"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 \).
추가 정보:
답변2
불행하게도 정규식의 정확한 구문은 프로그램마다 약간씩 다릅니다. grep 정규식은 sed 정규식과 정확히 동일하지 않으며 Emacs 정규식과 정확히 동일하지 않으며 Emacs 정규식도 정확히 동일하지 않습니다. 이는 C++ 정규식과 정확히 동일하지 않습니다. 정규식은 정확히 동일하지 않습니다. 설상가상으로 grep과 같은 "표준" 도구도 Unix 계열 운영 체제마다 조금씩 다릅니다.
정규 표현식에서 일부 문자는 특별한 의미(예: 대괄호)를 가지며, 문자 앞에 백슬래시를 배치하여 "이스케이프"하면 리터럴 문자로서의 일반 의미로 되돌아갑니다(따라서 리터럴 괄호는 \[)로 쓰세요. 반대로 다른 것들은 이스케이프된 경우에만 특별한 의미를 갖습니다(예를 들어 일반 n은 문자일 뿐이지만 \n은 개행 문자입니다). 다시 말하지만 이는 정규식 구현에 따라 다를 수 있습니다.
대부분의 정규식 구현에서 물음표는 이전 항목이 선택 사항임을 의미하고 이스케이프된 물음표(\?)는 문자 그대로의 물음표를 의미합니다. 그러나 일부 방언에서는 그 반대가 사실입니다. 귀하의 예는 어느 쪽이든 의미가 있지만 어디에 방언이 있는 것 같나요? 리터럴이고 \?는 선택적 기호입니다. 따라서 정규식은 "3자리 숫자, 선택적으로 공백 또는 대시, 4자리 숫자"를 의미할 수 있습니다.
(또 다른 단서는 "이전 항목의 정확히 3개"를 의미하는 \{3\}과 같은 구문에서 볼 수 있습니다. 대부분의 정규식 방언에서 이는 {3} 로 작성되지만 \{는 문자 그대로 중괄호입니다.)
답변3
다음은 이미 다른 답변에 포함된 정보에 대한 간략한 요약입니다.
에서 는 grep
문자 ?
그대로의 물음표 문자와 일치하며 \?
그 앞에 오는 내용이 0개 또는 1개 발생함을 나타냅니다. 따라서 질문의 예에서 [ -]\?
공백이나 하이픈을 일치시키거나 아무것도 일치시키지 마십시오.
egrep
또는 에서는 grep -E
그 반대가 사실입니다. \?
문자 그대로의 물음표와 일치한다는 것은 ?
0개 또는 1개의 발생을 의미합니다.
이는 GNU grep에 적용됩니다. 비GNU grep 구현의 세부 사항은 약간 다를 수 있습니다. 특히 grep
과(는 ) 역사적으로 두 개의 별도 프로그램이므로 오래된 프로그램에는 옵션이 egrep
없다고 생각합니다 . POSIX에서는 이를 지정했지만 (놀랍게도) 언급하지 않았습니다 .grep
-E
grep -E
egrep