grep 매뉴얼에 따르면:
* The preceding item will be matched zero or more times.
+ The preceding item will be matched one or more times.
테스트해보자
echo 'agb' | grep 'a.*b' # returns agb
echo 'agb' | grep 'a.+b' # returns nothing
+가 3gs와 일치하지 않는 이유는 무엇입니까? 내가 아는 한 3 대 1이 더 크다.
답변1
우리가 "정규 표현식"이라고 생각하는 것 중 상당수는 실제로 정규 표현식이라고 합니다.확장 정규식(또는 ERE)를 POSIX에서 사용합니다. 그런데 네 grep
휴대전화가 켜져 있는 것 같아기본 정규식모드(또는 줄여서 BRE)입니다. BRE와 ERE에는 많은 차이점이 있습니다. 이러한 차이점 중 하나는 +
백슬래시로 이스케이프하지 않는 한 메타 문자를 이스케이프해야 한다는 것입니다 . 는 문자 그대로의 더하기 기호입니다. 귀하의 grep
명령은 BRE 모드에 있는 것 같으므로 \+
일반 +
.
BRE와 ERE를 매우 엄격하게 비교하는 경우 BRE는 및 구문을 각각 사용하여 에뮬레이트 할 수 있지만 실제로 +
및 작업을 지원하지 않습니다 . Strict BRE도 연산자를 지원하지 않으며 BRE에서 이를 에뮬레이트하는 방법을 잘 모르겠습니다. 그러나 ERE와 달리 BRE는 역참조를 지원합니다(괄호를 이스케이프해야 한다는 점을 제외하면 Perl과 매우 유사함).?
\{1,\}
\{0,1\}
|
일부 구현(예: GNU) 은 grep
BRE 모드에서 ?
및 연산자 +
를 지원 하지만 |
다른 메타 문자처럼 이스케이프해야 합니다 \?
. 그러나 내가 아는 한 ERE 모드에서는 역참조를 지원하는 구현이 없습니다.\+
\|
grep
ERE 모드를 강제로 사용하려면 grep
옵션을 사용 -E
하거나 grep
로 호출할 수도 있습니다 egrep
.
답변2
어떤 grep 매뉴얼을 읽고 있든 상관없이 다양한 유형의 정규식(기본 및 확장)을 설명하는 섹션이 있어야 합니다. 이 +
연산자는 기본 버전에서는 사용할 수 없으며 확장 버전에서만 사용할 수 있습니다. 확장 정규식을 사용하려면 이 -E
옵션이 필요합니다.