Veja o que significa sua expressão regular, da esquerda para a direita:
[
início de um conjunto de caracteres (ou classe de caractere). Corresponde a um caractere do conjunto.
a-z,A-Z,0-9
dentro de um conjunto de caracteres significa corresponder a qualquer caractere a-z
ou A-Z
ou 0-9
. As vírgulas são realmente opcionais aqui, a menos que você esteja tentando corresponder literalmente a uma vírgula.
\.\-
.
é um caractere especial que combina com qualquer caractere, mas dentro de um conjunto de caracteres ele não tem nenhum significado especial e não precisa ser escapado. O -
aqui não precisa ser escapado, se for o primeiro ou último caractere em um conjunto que corresponde a um literal -
, ele só assume um significado especial quando entre dois outros caracteres em um conjunto.
]
fim do conjunto de caracteres. O conjunto corresponde a qualquer caractere a-z
ou A-Z
ou 0-9
ou .
ou -
.
{2,}
é um quantificador. Isso significa que o regex anterior deve ser combinado 2 ou mais vezes.
Assim, o comando pode ser reduzido para isso:
grep -E "[a-zA-Z0-9.-]{2,}" /etc/hostname
Quando usado com o -P
flag grep interpreta o padrão como uma expressão regular Perl. As expressões regulares Perl são quase idênticas ao regex do Python. É um modo mais poderoso que -E
na minha opinião. No modo Perl, seu comando se torna:
grep -P "[a-zA-Z\d.-]{2,}" /etc/hostname