명령(리눅스 터미널) (^[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) 문자와 일치합니다 . 정확히 무엇이 구성되는지는 환경 변수에 의해 결정되는 "조합 순서"에 따라 다릅니다 .0
9
LC_COLLATE
- 는
.
임의의 단일 문자와 일치하므로 two는..
"임의의 두 문자"를 의미합니다. - again 은
[a-zA-Z]
문자 목록이며 및 및 사이에 해당하는 문자 (1) 와 더불어 및 사이에 해당하는 문자와 일치합니다 . 다시 말하지만, 이것이 의미하는 바는 조합 순서에 따라 다릅니다!a
z
A
Z
+
"이전 것 중 하나 이상"을 의미합니다 .$
정규식의 이 위치를 줄 끝에 연결하는 앵커입니다 .
그래서, 귀하의 RegEx~을 의도한다(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
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