Versão curta, use isto:
$ echo "[email protected]" |
> gawk '/^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.([a-zA-Z]{2,5})$/'
Supondo que a mensagem de erro real é algo como:
awk: cmd. line:1: error: Invalid range end: …
Em seguida, há quatro problemas na sua linha:
-
O traço (
-
) significa "intervalo de caracteres", não um traço explícito.O motivo da mensagem de erro é que os dois caracteres ao redor do traço (
-
) dentro do intervalo de caracteres (_
e.
) não estão na ordem (ASCII). O intervalo de caracteres.-_
não gera erros. Mas tenho certeza de que você não pretende dizer "intervalo de caracteres" (todos os caracteres entre um ponto.
e um sublinhado_
), mas para corresponder a um traço explícito (-
).Para corresponder a um traço explícito dentro de uma "expressão de colchetes", é necessário torná-lo o primeiro ou o último caractere do intervalo.
[-…]
,[…-]
. Ou, desanimado, escape\-
. Ou seja, ambos os trabalhos:[-a-zA-Z0-9_.+] [a-zA-Z0-9_.+-]
Mas não, uma barra invertida é não uma solução geral para tornar um traço explícito. Experimente:
$ echo 'ab-cd' | grep -Eo '[a\-c]+' ab c
O regex do grep (mesmo se estendido:
-E
) não corresponde ao traço. -
O
+
não é especial dentro de uma "expressão de colchetes", portanto, ele não precisa de escape (e escapar dentro de "expressões de colchetes" é um mau hábito). Use isto:^([-a-zA-Z0-9_.+]+)@
-
Um ponto
.
é um caractere especial que "corresponde a qualquer caractere, exceto a nova linha".
Como tal, você precisa fugir dele\.
ou usar uma "expressão de colchetes"[.]
para corresponder explicitamente a um caractere de ponto, use este:^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.
-
E, finalmente, a "expressão de intervalo" é uma extensão sobre implementações históricas do awk, pode não funcionar em todos os awk's. Isso geralmente não é "um problema", mas se for, você precisará usar:
([a-zA-Z][a-zA-Z][a-zA-Z]?[a-zA-Z]?[a-zA-Z]?)$
Mas você provavelmente está usando o GNU awk, e a sintaxe correta deve ser:
$ echo "[email protected]" |
> gawk '/^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.([a-zA-Z]{2,5})$/'