정규식 grep -r 'emm*[af].[^ta]$'

정규식 grep -r 'emm*[af].[^ta]$'

나는 1시간 전에 grep 명령을 사용하여 정규 표현식에 대해 비슷한 질문을 했습니다. 동일한 스레드에 게시하는 것이 선호되는 옵션이라면 용서해 주십시오. 그렇다면 다음에 그렇게 하겠습니다.

기본 구성처럼 보일 수도 있지만 정규식 인식 패턴이 어떻게 작동하는지 이해하려고 노력 중이며, 내가 얻는 결과는 내가 읽고 있는 매뉴얼과 모순되는 것 같습니다. (자료를 올바르게 해석하지 못한 것 같습니다. ).

파일에는 다음 단어 목록이 포함되어 있습니다.

mael@mael-HP:~/repertoireVide$ cat MySQLServ
remembré
emmuré
emmené
dilemmes
jumeaux
écrémage
emmena
emmailloter
flemmard

다음 명령은 출력을 제공합니다

mael@mael-HP:~/repertoireVide$ grep -r 'emm*[a-f].[^ta]$'
MySQLServ:remembré
MySQLServ:emmené
MySQLServ:flemmard

grep"emmailloter" 때문에 "emmailloter"라는 단어가 일치하지 않는 이유를 알고 싶습니다 .

  1. "em"이 포함되어 있습니다.
  2. [af] 사이에 문자가 옵니다: 'a'
  3. "I"는 "." 구성요소를 만족합니다.
  4. 문자 "t" 또는 "a"로 끝나지 않습니다.

감사해요.

답변1

단어에는 일치하는 비트 사이에 있는 것 emmailloter보다 훨씬 더 많은 내용이 포함되어 있습니다 . i이 패턴은 단일 문자에만 일치하므로 끝과 사이에서 여러 문자를 일치시키려면 여러 문자를 허용해야 합니다.[a-f][^ta]$.emmar

emm*[a-f]..*[^ta]$

grep -E(확장 정규식 활성화)를 사용하면 "최소 하나의 문자와 일치"라고 ..*쓸 수 있습니다 . .+표현식은 ..*"한 문자와 일치하고 그 다음에는 더 많은 문자와 일치"라고 읽습니다. 마찬가지로, 사용되는 경우 emm*로 대체될 수 있습니다 em+. 즉, " e다음에 적어도 하나"가 옵니다.mgrep -E

이것은 문자열과 일치합니다

blop-emmmmmmmmma-blarg-b
     ^^^^^^^^^^^^^^^^^^^
     1111111111233333334

1: emm*
2: [a-f]
3: ..*
4: [^ta]$

(위의 문자로 표시되는 일치 부분 ^) 예를 들어 다음과 같습니다 emmailloter.

emmailloter
^^^^^^^^^^^
11123333334

시험:

$ grep -E 'emm*[a-f].+[^ta]$' MySQLServ
remembré
emmené
emmailloter
flemmard

단어의 경우 remembré일치 항목은 다음과 같습니다.

remembré
 ^^^^^^^
 1123334

아니요

remembré
   ^^^^^
   11234

한 가지 방법은심상일치하는 용도 sed:

$ sed -n -E 's/(emm*)([a-f])(.+)([^ta]$)/(\1)(\2)(\3)(\4)/p' MySQLServ
r(em)(e)(mbr)(é)
(emm)(e)(n)(é)
(emm)(a)(illote)(r)
fl(emm)(a)(r)(d)

이렇게 하면 일치하는 행만 인쇄되며, 정규식의 일치하는 각 부분은 괄호로 묶입니다. 또한 이는 프랑스어 문자를 일치시키는 데 사용할 수 있는 구현을 사용하고 sed있으며 이를 위해 로케일 환경 변수가 올바르게 설정되어 있다고 가정합니다.

이것을 원래 표현식에서 생성된 결과와 비교하십시오.

$ sed -n -E 's/(emm*)([a-f])(.)([^ta]$)/(\1)(\2)(\3)(\4)/p' MySQLServ
rem(em)(b)(r)(é)
(emm)(e)(n)(é)
fl(emm)(a)(r)(d)

관련 정보