REGEX direto no Bash

regexbash_abertura.png

Geralmente quando validava uma sequência de caracteres em shell script usando uma expressão regular eu recorria a uma ferramenta externa (egrep, sed etc) para fazê-lo —  algo como neste exemplo de validação de endereços de e-mail utilizando o egrep:

$ echo "usuario@email.com" |\
  egrep "[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$" >/dev/null ; echo $?
0
$ echo "usuario%email-123" |\
 egrep "[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$" >/dev/null ;  echo $?
1

Ou seja, o retorno do valor 0 para significando verdadeiro e do valor 1 indicando falso.

Mas acontece que o Bash tem suporte nativo a expressões regulares, algo que acelera consideravelmente estas validações já que não há a necessidade de se executar um programa externo.

Basta utilizar os colchetes duplos e o operador “=~” para a validação:

$ [[ "usuario@email.com" =~ [a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$ ]] ; echo $?
0
$ $ [[ "usuario%email-123" =~ [a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$ ]] ; echo $?
1

Os valores de retorno são idênticos — o valor 0 ainda é verdadeiro e valor 1 ainda é falso — e o código resultante ainda fica mais legível. E para ajudar a fixar este mesmo exemplo na forma de um script completo:


#!/bin/bash
email_REGEX="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$"
email_to_check=${1}
if [ -z "${email_to_check}" ]; then
echo "É necessário inserir um endereço de e-mail!"
exit 2
else
if [[ "${email_to_check}" =~ ${email_REGEX} ]]; then
echo "O endereço '${email_to_check}' é válido!"
else
echo "O endereço '${email_to_check}' não é válido!"
exit 1
fi
fi
exit 0

view raw

email_test.sh

hosted with ❤ by GitHub

Só um detalhe, isto só funcionará com o Bash, o “/bin/bash”, e não com o o Dash, que em algumas distribuições responde como “/bin/sh” ao invés do Bash. Portanto preste atenção a este pequeno detalhe.

5 comentários sobre “REGEX direto no Bash

  1. Primeiramente parabéns por mostrar esse tipo de coisa, que não deve ser muito usado justamente por não ser conhecido. Eu sou um exemplo, apesar de já ter visto algumas vezes isso, eu sempre uso o egrep, sed, etc. e eu não tenho desculpa, pois sempre uso o bash como shell.

    Agora uma reclamação, sobre o exemplo dado, sei que ele se destina a mostrar a funcionalidade, mas não posso deixar de achar ruim e classificar como um mal costume fazer esse tipo de restrição ao e-mail. Tanto e-mail quanto nome de domínio, podem ser escritos com letras maiúsculas e minúsculas, e eu não gosto de informar meu e-mail em diversos formulários pela web afora e perder tempo lendo mensagens de erro por conta de que sempre escrevo alguns caracteres em caixa alta, coisa que melhora enormemente a visualização do e-mail.

    Além da reclamação acima, que não foi necessariamente direcionada ao autor do post, mas visando sobretudo aos leitores, para que a informação seja disseminada e que eles lembrem disso, caso venham a fazer formulários ou programas que pedem para que se digite o e-mail, eu tenho uma má notícia para quem quer validar um e-mail ou mesmo nome de domínio. Faz tempo que é possível usar os diversos caracteres Unicode (não sei se todos) nesses nomes. Assim validar um e-mail digitado por um usuário pode requerer passos adicionais, como verificar o IDN (ao menos do nome de domínio).

    Por exemplo, a URL:

    http://www.CriançaEsperança.com.br/

    é perfeitamente válida, tanto é que é real, basta clicar para acessar. Sendo também possível que o responsável pelo domínio acima possa criar um e-mail como Ação@CriançaEsperança.com.br (esse “Ação” foi só para exemplificar não deve existir mas é possível de ser criado).

    Curtir

    • No bash para nosso LOCALE a expressão regular fornecida pelo autor é suficiente para acentuação:
      $ echo “UsuárioComAcentuação@email.com” | egrep “[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$” >/dev/null ; echo $?
      0
      Porém, se você quiser ser mais rigoroso, recomendo a regex abaixo.
      $ echo -n “ßÇçãÃáÁÀàüÜíÍóÓúÚõÕéÉèÈëËöÖ@email.com” | egrep ‘[[:alnum:]\._%+-]*+@[[:alnum:]\.-]+\.[[:alpha:]]{2,4}$’ >/dev/null ; echo $?
      0

      Curtir

  2. Pingback: Arrays em Bash | giovannireisnunes

  3. Pingback: Manipulação de strings em Bash | giovannireisnunes

  4. Pingback: Expressões regulares, o básico – parte 3 | giovannireisnunes

Os comentários estão desativados.