저는 대본을 작성하고 그것을 이해하려고 노력해 왔는데, 여기 제가 이해할 수 없는 구절이 있습니다.
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
플래그와 함께 사용하면 -P
grep은 패턴을 Perl 정규식으로 해석합니다. Perl 정규식은 Python 정규식과 거의 동일합니다. 이것은 -E
제가 생각하는 것보다 더 강력한 모델입니다. Perl 모드에서 명령은 다음과 같습니다:
grep -P "[a-zA-Z\d.-]{2,}" /etc/hostname
답변2
는 {2,}
수량자이며, 이 경우 목록에서 가능한 한 많은 문자 인스턴스를 2개부터 일치시킵니다 []
.
\.\-
"-" 또는 "."와 일치합니다 . 이 두 문자는 일반적으로 특수 문자이므로 일반적으로 이스케이프해야 합니다 \
. 하지만 그룹 내부에서는 []
포인트가 특별하지 않으므로 \
이 경우에는 필요하지 않습니다. 또한 -
범위 표시이므로 그룹의 첫 번째인지 마지막인지는 특별하지 않습니다.
따라서 결국 다음을 사용할 수 있습니다.
[,a-zA-Z0-9.-]{2,}