누군가 다음 표현의 의미를 설명할 수 있나요 grep
? 이것은 어떻게 다릅니까 egrep
?
그리고 grep
:
^[0-9]\+$
[0-9]\{3\}.*[0-9]\{3\}
^.*[0-9]$
그리고 egrep
:
^[0-9]{7}$
^.*$
답변1
egrep
grep
1970년대 후반부터 Unix V7의 새로운 구현으로 새로운 정규식 엔진과 구문을 사용했습니다( awk
V7도 출시되었으며 // 사용된 구문 대신 동일한 새로운 확장 정규식(ERE) 구문을 사용했습니다 grep
). 그 이후로 POSIX는 명령 기능을 옵션에 병합하고 더 이상 사용되지 않습니다.ed
sed
egrep
grep
-E
egrep
요즘 일부 시스템에서는 아직 사용하도록 업데이트되지 않은 스크립트와의 하위 호환성을 위해 비슷한 작업을 수행하는 -script egrep
일 뿐입니다 .sh
exec grep -E "$@"
grep -E
$ cat /usr/bin/egrep
#!/bin/sh
exec grep -E "$@"
따라서 egrep
전혀 grep -E
차이가 없습니다 .
^
라인 시작 앵커 에 사용되며 이에 따라 $
라인 끝 앵커에도 사용됩니다.
이는 [0-9]
로캘의 0~9 범위에 있는 데이터 정렬 요소와 일치합니다. 이전에는 0123456789만 포함되었지만 시스템 및 로케일에 따라 더 많이 포함될 수 있습니다.
이는 {min,Max}
알려진 간격 표현식입니다.
이는 .*
0개 이상의 문자로 구성된 시퀀스와 일치합니다.
ERE(예: egrep
/ )에는 , 및 , 등 awk
몇 가지 새로운 연산자가 도입되고 역참조 지원이 제거됩니다.+
?
|
BRE의 그룹화 연산자 \(...\)
(에서 사용되는 기본 정규식 grep
)는 (...)
ERE에 있습니다.
정규식에는 처음에는 간격 연산자가 없었습니다. BRE에서는 먼저 추가되었지만 \{x,y\}
ERE에서는 추가되지 않았습니다. 그렇게 하면 이전 버전과의 호환성이 손상되기 때문입니다. 이는 {x,y}
90년대에 ERE를 지정했던 POSIX에 의해 변경되었습니다 . 오늘날까지도 이를 지원하지 않는 egrep
일부 구현이 여전히 있습니다.awk
GNU 구현 grep
(및 BRE를 사용하는 기타 유틸리티)은 한 단계 더 나아가 BRE에 +
, ?
, ERE 연산자를 추가 하고 비표준 일관성 확장으로 ERE( )를 사용하는 역참조를 지원하므로 이러한 구현에서 BRE 및 ERE는 다음과 같습니다. 기능적으로는 동일하지만 구문이 다릅니다.|
\+
\?
\|
grep -E
당신은 또한 볼 수 있습니다내 정규 표현식이 X에서는 작동하지만 Y에서는 작동하지 않는 이유는 무엇입니까?.
여기 있어요https://www.regular-expressions.info/posix.html#bre또한 ERE/BRE 등에 관한 매우 좋은 정보도 찾았습니다.
나는 또한 here 에서 이 정규식 비교를 찾았습니다.https://www.regular-expressions.info/refrepeat.html매우 유용합니다. 다음과 같이 4개를 결합하세요.
특징 | 통사론 | 설명하다 | 예 | GNU 브레이 | 그누 에레 | POSIX BRE | POSIX ERE |
---|---|---|---|---|---|---|---|
탐욕스러운 수량자 | ? (물음표) | 이전 항목을 선택 사항으로 만듭니다. 욕심이 많으니 가능하면 선택항목도 매치에 포함시켜주세요. | 알파벳? abc 또는 ab와 일치 | 아니요 | 예 | 아니요 | 예 |
탐욕스러운 수량자 | ? | 이전 항목을 선택 사항으로 만듭니다. 욕심이 많으니 가능하면 선택항목도 매치에 포함시켜주세요. | 알파벳? abc 또는 ab와 일치 | 예 | 아니요 | 아니요 | 아니요 |
탐욕스러운 수량자 | * (별) | 이전 항목을 0번 이상 반복합니다. Greedy는 이전 항목이 전혀 일치하지 않을 때까지 이전 항목과 더 적은 순열을 일치시키려고 시도하기 전에 가능한 한 많은 항목을 일치시킵니다. | ".*"는 abc "def" "ghi" jkl의 "def" "ghi"와 일치합니다. | 예 | 예 | 예 | 예 |
탐욕스러운 수량자 | +(더하기 기호) | 이전 항목을 한 번 이상 반복합니다. 탐욕적이므로 이전 항목이 한 번만 일치할 때까지 이전 항목과 더 적은 일치 항목으로 순열을 시도하기 전에 가능한 한 많은 항목을 일치시킵니다. | ".+"는 abc "def" "ghi" jkl의 "def" "ghi"와 일치합니다. | 아니요 | 예 | 아니요 | 예 |
탐욕스러운 수량자 | + | 이전 항목을 한 번 이상 반복합니다. 탐욕적이므로 이전 항목이 한 번만 일치할 때까지 이전 항목과 더 적은 일치 항목으로 순열을 시도하기 전에 가능한 한 많은 항목을 일치시킵니다. | ".+"는 abc "def" "ghi" jkl의 "def" "ghi"와 일치합니다. | 예 | 아니요 | 아니요 | 아니요 |
고정 수량자 | {n} 여기서 n은 정수 >= 1입니다. | 이전 항목을 정확히 n번 반복합니다. | a{3}는 aaa와 일치합니다. | 아니요 | 예 | 아니요 | 예 |
탐욕스러운 수량자 | {n,m} 여기서 n >= 0이고 m >= n | 이전 항목을 n~m번 반복합니다. 탐욕스럽기 때문에 반복 횟수를 n으로 줄이기 전에 m번 반복해 보세요. | a{2,4}는 aaaa, aaa 또는 aa와 일치합니다. | 아니요 | 예 | 아니요 | 예 |
탐욕스러운 수량자 | {n,} 여기서 n >= 0 | 이전 항목을 n번 이상 반복합니다. 욕심쟁이(Greedy)이므로 이전 항목에 대해 더 적은 수의 일치 항목으로 순열을 시도하기 전에 이전 항목이 n번만 일치할 때까지 가능한 한 많은 항목을 일치시킵니다. | a{2,}는 aaaaa의 aaaaa와 일치합니다. | 아니요 | 예 | 아니요 | 예 |
탐욕스러운 수량자 | {,m} 여기서 m >= 1 | 이전 항목을 0~m번 반복합니다. 욕심이 많으니 반복 횟수를 0으로 줄이기 전에 m번 반복해 보세요. | a{,4}는 aaaa, aaa, aa, a 또는 빈 문자열과 일치합니다. | 아니요 | 예 | 아니요 | 아니요 |
고정 수량자 | {n} 여기서 n은 정수 >= 1입니다. | 이전 항목을 정확히 n번 반복합니다. | a{3}는 aaa와 일치합니다. | 예 | 아니요 | 예 | 아니요 |
탐욕스러운 수량자 | {n,m} 여기서 n >= 0이고 m >= n | 이전 항목을 n~m번 반복합니다. 탐욕스럽기 때문에 반복 횟수를 n으로 줄이기 전에 m번 반복해 보세요. | a{2,4}는 aaaa, aaa 또는 aa와 일치합니다. | 예 | 아니요 | 예 | 아니요 |
탐욕스러운 수량자 | {n,} 여기서 n >= 0 | 이전 항목을 n번 이상 반복합니다. 욕심쟁이(Greedy)이므로 이전 항목에 대해 더 적은 수의 일치 항목으로 순열을 시도하기 전에 이전 항목이 n번만 일치할 때까지 가능한 한 많은 항목을 일치시킵니다. | a{2,}는 aaaaa의 aaaaa와 일치합니다. | 예 | 아니요 | 예 | 아니요 |
탐욕스러운 수량자 | {,m} 여기서 m >= 1 | 이전 항목을 0~m번 반복합니다. 욕심이 많으니 반복 횟수를 0으로 줄이기 전에 m번 반복해 보세요. | a{,4}는 aaaa, aaa, aa, a 또는 빈 문자열과 일치합니다. | 예 | 아니요 | 아니요 | 아니요 |