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

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

(^[0-9]..[a-zA-Z ]+$)명령(Linux 터미널)에서 감지된 정규식을 이해하려고 합니다 .grep

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

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

다음과 같은 표현식이 포함된 줄을 감지 하지만 그것이 무엇을 의미하는지 , 그리고 명령을 사용하여 어떤 종류의 표현식을 감지할 수 있는지 92afg 잘 모르겠습니다.+$

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

새 텍스트 파일을 열고 감지될 것으로 생각되는 표현식만 입력해 보았지만 일치하는 표현식이 하나도 없었으므로 이에 대한 설명을 듣고 싶습니다.

답변1

그것을 분석해 봅시다. 먼저, 이 RegExp는"확장 정규식"구문(ERE) - +기본적으로 사용되는 "기본 정규식" 구문에 영향을 주지 않는 메타 문자입니다 grep(즉, 자체적으로 일치하고 해당 위치에 리터럴이 필요함을 의미함 +). 해당 정규식을 사용하려면 grep다음이 필요합니다. 이 옵션을 전달합니다 -E.

  • ^정규식의 이 위치를 줄의 시작 부분에 연결하는 앵커 입니다 .
  • [0-9]는 및 사이의 정렬 범위에 속하는 단일 (1) 문자 와 일치하는 문자 목록 입니다 . 포함되는 내용은 환경 변수에 따라 결정되는 "정렬 순서"에 따라 다릅니다.09LC_COLLATE
  • .단일 문자와 일치하므로 2는 .."임의의 두 문자"를 의미합니다.
  • 반환값은 (1) 과 사이의 문자 및 (1)과 사이의 문자 [a-zA-Z]와 일치하는 문자 목록입니다 . 다시 말하지만, 이것이 의미하는 바는 정렬 순서에 따라 다릅니다!azAZ
  • +"이전의 하나 이상"을 의미
  • $정규식의 이 위치를 줄의 끝 부분에 연결하는 기준점 입니다 .

그래서, 당신의 정규식~을 목표로(1) 다음 조건을 충족하는 행과 일치

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

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

몇 가지 메모

  1. 귀하의 예에서는 따옴표 없이 정규식을 사용합니다. 이는 명령에 전달되기 전에 모든 문자가 쉘에 의해 해석될 수 있음을 의미합니다 grep. 패턴에 $와일드카드 문자( *및 문자 목록 ?! [...])가 포함되어 있으면 쉘은 변수 확장을 수행하거나(따라서 정규식의 일부 대체) 와일드카드 패턴을 여러 파일 이름으로 확장하여 최종 파일 이름에 더 많은 매개변수를 갖게 됩니다. 원래 원했던 것보다 명령줄이 더 많아졌습니다. 셸에 고유한 다른 문자( >, #;)는 예상치 못한 동작을 더 많이 일으킬 수 있습니다. 당신은 사용해야합니다

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

    대신에. -x이 플래그를 사용하여 "전체 줄" 일치를 강제하면 시작 및 끝 앵커를 제거 할 수 있습니다 .

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

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

답변2

+"이전의 한 번 이상의 반복"을 나타내며 $"줄 끝"입니다. *"0회 이상 반복"을 의미하는 with와의 차이점에 유의하세요 .

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

è(일부 로케일에는 예를 들어 또는 ŷ언어에 따라 예상한 AZ 또는 a-z의 26자 이상의 문자가 포함될 수 있습니다 .)

정규 표현식에 대한 좋은 가이드입니다. 적극 추천합니다.Grimmaul의 아름다운 웹사이트, 나는 또한 예를 들어 sed및 을 진심으로 추천합니다 awk.


왜 일치하지 않습니까?

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

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

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

관련 정보