grep 명령의 패턴 (^[0-9]..[a-zA-Z ]+$)과 일치하는 표현식은 무엇입니까? 리눅스 배쉬

grep 명령의 패턴 (^[0-9]..[a-zA-Z ]+$)과 일치하는 표현식은 무엇입니까? 리눅스 배쉬

명령(리눅스 터미널) (^[0-9]..[a-zA-Z ]+$)에서 정규 표현식이 정확히 어떤 표현식을 감지하는지 이해하려고 합니다.grep

다음 명령을 작성하면 알 수 있습니다.

grep ^[0-9]..[a-zA-Z] filename.txt

나는 다음과 같은 표현을 포함하는 모든 줄을 감지할 것입니다. 92afg 그러나 어떤 의미인지 잘 모르겠으며 +$, 어떤 종류의 표현을 명령으로 감지할 수 있습니까?

grep ^[0-9]..[a-zA-Z]+$ filename.txt

새 텍스트 파일을 열고 감지될 것이라고 생각되는 표현식을 입력하려고 시도했지만 일치하는 표현식이 하나도 없었으므로 이에 대한 설명을 부탁드립니다.

답변1

그것을 분석해 봅시다. 우선, 이 RegExp는"확장 정규식"구문(ERE) - 기본적으로 사용되는 +"기본 정규식" 구문에서 작동하지 않는 메타 문자입니다 grep(즉, 자체적으로 일치하고 +해당 위치에 리터럴이 필요함). 따라서 해당 RegEx를 다음과 함께 사용하려는 경우 grep, 옵션을 전달해야 합니다 -E.

  • ^정규식의 이 위치를 줄의 시작 부분에 연결하는 앵커입니다 .
  • 은 문자 목록이며 및 사이의 정렬 범위에 속하는 [0-9]단일 (1) 문자와 일치합니다 . 정확히 무엇이 구성되는지는 환경 변수에 의해 결정되는 "조합 순서"에 따라 다릅니다 .09LC_COLLATE
  • .임의의 단일 문자와 일치하므로 two는 .."임의의 두 문자"를 의미합니다.
  • again 은 [a-zA-Z]문자 목록이며 및 및 사이에 해당하는 문자 (1) 와 더불어 및 사이에 해당하는 문자와 일치합니다 . 다시 말하지만, 이것이 의미하는 바는 조합 순서에 따라 다릅니다!azAZ
  • +"이전 것 중 하나 이상"을 의미합니다 .
  • $정규식의 이 위치를 줄 끝에 연결하는 앵커입니다 .

그래서, 귀하의 RegEx~을 의도한다(1) 다음과 같은 줄과 일치합니다.

  • 임의의 숫자로 시작
  • 그 뒤에 임의의 두 문자가 옵니다.
  • 줄 끝까지 문자(적어도 하나 이상)만 포함합니다.

(1) 실제로 수행할 수 있는 작업은 아래를 참조하세요.

일부 메모

  1. 귀하의 예에서는 따옴표가 없는 정규식을 사용합니다. 이는 모든 문자가 명령에 전달되기 전에 셸에서 해석될 수 있음을 의미합니다 grep. 패턴에 $문자( *?문자 [...]목록!)가 포함되어 있으면 쉘은 변수 확장을 수행하거나(따라서 RegEx의 일부를 대체) globbing 패턴을 여러 파일 이름으로 확장하여 결국 더 많은 인수를 갖게 됩니다. 원래 의도했던 명령줄에서. 셸에 특수한 다른 문자( >, 등)는 훨씬 더 예상치 못한 동작을 초래할 수 있습니다 #. ;당신은 사용해야합니다

    grep -E '^[0-9]..[a-zA-Z]+$' filename.txt
    

    대신에. -x"전체 라인" 일치를 적용하는 플래그를 사용하여 열기 및 닫기 앵커를 제거할 수 있습니다 .

    grep -x -E '[0-9]..[a-zA-Z]+' filename.txt
    
  2. a-z범위(예: )를 포함하는 문자 목록은 다음과 같습니다.위험한왜냐하면 그들은 당신이 생각하는 것을 제공하지 않을 수도 있기 때문입니다. 순진하게는 ASCII 테이블의 시작 문자와 끝 문자 사이에 있는 모든 문자와 일치할 것으로 예상할 수 있지만 이는 로케일에만 적용됩니다 C. 다른 로케일(특히 와 같이 일반적으로 설정된 시스템 로케일 en_US.UTF-8)에서 대조 순서는 다음과 같으 aAbB ... zZ므로 a-z대부분의 대문자와도 일치합니다. 또한 일치 항목은 실제로 단일 문자 수준이 아니라 일부 로케일에서 의미하는 "조합 요소" 수준에 있습니다.여러 글자의 조합일치할 수 있습니다(예: dzs헝가리어)! 보다이 답변(또는 일반적으로 패턴 일치에 대한 @Stéphane Chazelas의 대부분의 답변) 더 많은 통찰력을 얻을 수 있습니다. 범위가 작동하는지 확인하려면 최소한 다음을 통해 주어진 명령에 대해 대조 순서를 설정하십시오.

    LC_COLLATE="C" grep -E ' ... ' filename.txt
    

답변2

+"이전 내용의 하나 이상의 반복"을 의미하며 $"줄 끝"입니다. with 와의 차이점은 *"0개 이상의 반복"을 의미합니다.

따라서 이는 기본적으로 다음을 의미합니다. 숫자로 시작하는 모든 줄, 그 뒤에는 모든 종류의 두 문자, 이어서 줄 끝까지 하나 이상의(대문자) 문자가 옵니다.

è(¹ 주의하세요. 일부 로케일에는 예 를 들어 ŷ언어에 따라 AZ 또는 az에서 예상하는 26개의 문자가 없을 수도 있습니다 .)

정규식에 관한 좋은 가이드를 얻으려면 강력히 제안합니다.그리모아르의 아름다운 웹사이트sed, 예를 들어 및 에도 진심으로 추천합니다 awk.


왜 일치하지 않습니까?

+확장 정규식의 일부입니다(그렇지 않으면 리터럴 +-기호로 해석됩니다).

따라서 +"1회 이상의 반복"으로 사용하려면 -E-flag를 사용 grep하고 정규식을 인용하여 쉘 특수 문자와 관련된 문제를 피하십시오.

grep -E '^[0-9]..[a-zA-Z]+$' filename.txt

관련 정보