가능한 결과를 위한 Grep

가능한 결과를 위한 Grep

가능한 일치 항목을 찾으려고 노력 중입니다.

ex****e

그렇다면 ex로 시작하고 e로 끝나며 그 사이에 4개의 문자가 있는 항목은 어떻게 해야 할까요?

답변1

단일 문자와 일치하는 정규식 연산자는 입니다 .. 이는 ?셸의 와일드카드와 유사합니다. *자체는 정규식의 이전 콘텐츠 수에 관계없이(예: s(0 포함) a*수에 관계 없음 a) 및 셸 와일드카드의 문자 수와 일치합니다.

POSIXly에서 xe와 정확히 일치하는 줄을 찾으세요.

grep -xE 'ex.{4}e'

또는:

grep -x ex....e

또는:

grep -x 'ex.\{4\}e'

두 번째는 가장 휴대성이 좋은 것입니다. grep '^ex....e$'이는 Unix 버전 4(1973)의 원래 구현에서도 작동하지만 -xUnix 버전 7(1979)에 추가되어 이제 일반화되었으므로 신뢰할 수 있습니다.

egrepV7에는 확장 정규식도 추가되었지만 처음에는 {x,y}간격 연산자가 없었습니다. 이 연산자가 \{x,y\}추가되었지만 이전 버전과의 호환성이 손상될 수 있으므로 grep일반적으로 추가되지 않습니다 . egrep그러나 90년대 초반에 POSIX는 -E기능을 병합하고 지원을 요구하는 옵션을 도입했지만 이제는 더 이상 사용되지 않습니다.grepegrepgrep{x,y}egrep

그러나 여전히 가끔 grep지원되지 않는 구현 -E이나 Solaris와 같은 지원 egrep되지 않는 구현 (대신 사용해야 함 )을 발견할 수 있습니다.{x,y}/bin/grep/bin/egrep/usr/xpg4/bin/grep

일부 grep구현에서는 멀티바이트를 지원하지 않으며 해당 .정규식 연산자는 멀티바이트 문자(예: 비ASCII UTF-8 문자)의 모든 바이트와 일치할 수 있습니다.

$ $ locale charmap
UTF-8
$ echo extrême | busybox grep -x ex....e 
$ echo extrême | gnu-grep -x ex....e
extrême
$ echo extrême | busybox grep -x ex.....e
extrême

ê 문자는 UTF-8에서 2바이트로 구성되므로 extrême7자이지만 8바이트입니다.

$ printf %s extrême | wc -cm
      7       8

답변2

다음 정규식을 사용하십시오.

^ex.{4}e$

전임자:

$ grep -E '^ex.{4}e$' <<< 'ex****e'

또는

$ grep '^ex.\{4\}e$' <<< 'ex****e'

산출:

    ex****e

답변3

@stéphane-chazelas가 제안한 기본 패턴:

grep -xE 'ex.{4}e'  

@gilles-quenot의 제안과 동일하게 '-x' 스위치로 인해 공백 없이 'e', ​​​​'x', 임의의 4개 문자 및 'e'로만 구성된 행을 찾습니다.

grep -E ^ex.{4}e$

그러나 OP는 일치하지 않는 콘텐츠와 일치하는 콘텐츠가 있는 줄을 가질 수 있도록 "ex로 시작하고 e로 끝나며 그 사이에 4개의 문자가 있는 모든 것"을 원합니다. 이것을 얻으려면 다음 패턴이 필요합니다.

    grep -E 'ex.{4}e'

따옴표는 쉘 브래킷 확장을 방지합니다.

관련 정보