정규 표현식과 grep 및 egrep

정규 표현식과 grep 및 egrep

누군가 다음 표현의 의미를 설명할 수 있나요 grep? 이것은 어떻게 다릅니까 egrep?

그리고 grep:

  1. ^[0-9]\+$
  2. [0-9]\{3\}.*[0-9]\{3\}
  3. ^.*[0-9]$

그리고 egrep:

  1. ^[0-9]{7}$
  2. ^.*$

답변1

egrepgrep1970년대 후반부터 Unix V7의 새로운 구현으로 새로운 정규식 엔진과 구문을 사용했습니다( awkV7도 출시되었으며 // 사용된 구문 대신 동일한 새로운 확장 정규식(ERE) 구문을 사용했습니다 grep). 그 이후로 POSIX는 명령 기능을 옵션에 병합하고 더 이상 사용되지 않습니다.edsedegrepgrep-Eegrep

요즘 일부 시스템에서는 아직 사용하도록 업데이트되지 않은 스크립트와의 하위 호환성을 위해 비슷한 작업을 수행하는 -script egrep일 뿐입니다 .shexec 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 또는 빈 문자열과 일치합니다. 아니요 아니요 아니요

관련 정보