Bash 스크립트 grep -E "[az,AZ,0-9\.\-]{2,}" /etc/hostname

Bash 스크립트 grep -E "[az,AZ,0-9\.\-]{2,}" /etc/hostname

저는 대본을 작성하고 그것을 이해하려고 노력해 왔는데, 여기 제가 이해할 수 없는 구절이 있습니다.

grep -E "[a-z,A-Z,0-9\.\-]{2,}" /etc/hostname 이 코드에서는 /etc/hostname에서 데이터를 가져오려고 한다는 것을 이해합니다. az, AZ 또는 숫자로 시작하는 것은 무엇이든 가능합니다.

그러나 다음으로 시작하십시오.

\.\-]{2,}

이 부분은 알 수 없습니다. 그게 뭔지 설명해줄 수 있는 사람 있나요?

답변1

정규식의 의미는 왼쪽에서 오른쪽으로 다음과 같습니다.

[

문자 세트(또는 문자 클래스)의 시작입니다. 세트의 한 문자와 일치합니다.

a-z,A-Z,0-9

문자 집합에서 하나의 문자 a-z또는 A-Z또는 과 일치한다는 의미입니다 0-9. 여기서 쉼표는 문자 그대로 쉼표를 일치시키려는 경우가 아니면 실제로 선택 사항입니다.

\.\-

.는 모든 문자와 일치할 수 있는 특수 문자이지만 문자 세트에서 특별한 의미가 없으며 이스케이프할 필요가 없습니다. 여기서는 이스케이프가 필요하지 않습니다 -. 집합의 첫 번째 또는 마지막 문자인 경우 리터럴과 일치하며 -집합의 다른 두 문자 사이에 있는 경우에만 특별한 의미가 있습니다.

]

문자 집합의 끝입니다. 이 세트는 하나의 문자 a-z또는 A-Z또는 0-9또는 과 일치합니다 ..-

{2,}

수량자입니다. 이는 이전 정규식이 2번 이상 일치함을 의미합니다.

따라서 명령을 다음과 같이 단순화할 수 있습니다.

grep -E "[a-zA-Z0-9.-]{2,}" /etc/hostname

플래그와 함께 사용하면 -Pgrep은 패턴을 Perl 정규식으로 해석합니다. Perl 정규식은 Python 정규식과 거의 동일합니다. 이것은 -E제가 생각하는 것보다 더 강력한 모델입니다. Perl 모드에서 명령은 다음과 같습니다:

grep -P "[a-zA-Z\d.-]{2,}" /etc/hostname

답변2

{2,}수량자이며, 이 경우 목록에서 가능한 한 많은 문자 인스턴스를 2개부터 일치시킵니다 [].

\.\-"-" 또는 "."와 일치합니다 . 이 두 문자는 일반적으로 특수 문자이므로 일반적으로 이스케이프해야 합니다 \. 하지만 그룹 내부에서는 []포인트가 특별하지 않으므로 \이 경우에는 필요하지 않습니다. 또한 -범위 표시이므로 그룹의 첫 번째인지 마지막인지는 특별하지 않습니다.

따라서 결국 다음을 사용할 수 있습니다.

[,a-zA-Z0-9.-]{2,}

관련 정보