De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Julio Cezar Neves
Data de Publicação: 25 de julho de 2018
Um recadinho rápido antes da dica de hoje. Chegamos hoje ao último dia do workshop sobre Programação Shell Linux. Nesta última aula, chamada Como Aprender Shell Linux, nós mostramos um caminho para que também você se torne um especialista nesta linguagem de programação tão poderosa e cada vez mais requisitada no mercado.
Partindo de um determinado padrão de dado, as Expressões Regulares podem ser utilizadas para:
1. Pesquisar um arquivo por todas as ocorrências que casam com esse
padrão. Para fazer isso o ideal é usar os comandos grep
, awk
ou sed
.
A Expressão Regular para definir telefones celulares no formato (NN)NNNNN-NNNN com ou sem parênteses é:
'^(\(?[0-9]{2}\)?|[0-9]{2})[0-9]{5}-?[0-9]{4}$'
Onde | Significa | |
---|---|---|
^ |
Início do texto | |
(\(?[0-9]{2}\)?|[0-9]{2}) |
Um grupo para DDD com duas alternativas: uma com parênteses opcionais e (? ) escapados (\ ) por serem metacaracteres e a outra sem os parênteses. |
|
[9-0]{N} |
Qualquer algarismo que se repete N vezes | |
$ |
Fim do texto |
Para testar, coloque o número do seu celular entre as aspas que estão no
final do grep
a seguir:
if grep -Eq '^(\(?[0-9]{2}\)?|[0-9]{2})[0-9]{5}-?[0-9]{4}$' <<< "" then echo Casou else echo Solterou fi
A Expressão Regular para definir telefones fixo no formato (NN)NNNN-NNNN com ou sem parênteses é quase igual a anterior:
'^(\(?[0-9]{2}\)?|[0-9]{2})[0-9]{4}-?[0-9]{4}$'
Teste a Expressão Regular com um telefone fixo aqui:
if grep -Eq '^(\(?[0-9]{2}\)?|[0-9]{2})[0-9]{4}-?[0-9]{4}$' <<< "" then echo Casou else echo Solterou fi
Então para casar com fixo e celular, basta usar a Expressão Regular do fixo, porém aceitando 4 ou 5 algarismos, ficando:
'^(\(?[0-9]{2}\)?|[0-9]{2})[0-9]{4,5}-?[0-9]{4}$'
E para testá-la use:
if grep -Eq '^\(\(?[0-9]{2}\)?|[0-9]{2})[0-9]{4,5}-?[0-9]{4}$' <<< "" then echo Casou else echo Solterou fi
2. Alterar num arquivo por todas as ocorrências que casam com um padrão. Para
fazer isso o ideal é usar o comando sed
ou awk
.
Num arquivo que contem datas no padrão inglês (MM/DD/AAAA), vamos invertê-las para o nosso padrão (DD/MM/AAAA).
Para isso vamos usar o sed
com seu comando s
(substitute), que troca todos
os textos que casam com a Expressão Regular que está na primeira parte do
comando, pelo texto definido na segunda parte. Veja o comando:
sed -r 's|([0-9]{2})/([0-9]{2})/([0-9]{4})|\2/\1/\3|' arquivo
Onde | Significa | |
---|---|---|
| |
Delimitador das duas partes do comando substitute (s ) |
|
[0-9]{N} |
Dia, mês e ano | |
\1,\2 e \3 |
Retrovisores |
É muito bacana notarmos que o mês, o dia e o ano receberam um par de parênteses envolvendo cada um. Esses parênteses não têm o menor efeito na Expressão Regular, mas eles guardam o texto casado por cada um deles, que podem ser recuperados pelos retrovisores, que são numerados pela ordem da sua ocorrência na Expressão Regular, como fizemos, porém trocando o segundo pelo primeiro,
3. Testar se um dado é válido. Para fazer isso, o ideal é usar o novo comando test
ou o grep
.
No exemplo anterior, não interessava saber se as datas eram corretas ou não, pois já estavam armazenadas em um arquivo e por isso partimos do pressuposto que estavam certas. Agora temos um outro problema estamos recebendo datas de um meio externo e antes de gravá-las temos de verificar sua correção:
if [[ $Data =~ ^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/[0-9]{4}$ ]] then echo Data OK else echo Data NOK fi
Onde | Significa | |
---|---|---|
(0[1-9]|[12][0-9]|3[01]) |
Dia de 01 a 09 ou (| ) de 10 a 19 ou 30 a 31 |
|
(0[1-9]|1[12]) |
Mês de 01 a 09 ou 10 a 12 | |
[0-9]{4} |
Ano com 4 algarismos |
Agora coloque uma data válida e uma invalida na variável Data
e teste. Após
testar uma data válida, execute:
echo ${BASH_REMATCH[@]}
Isso é um vetor do sistema que contém a saída do último comando test
(que é o [[...]]
). Ele tem no seu índice zero (${BASH_REMATCH[0]}
)
tudo que casou e nos índices seguintes o que seriam os retrovisores, isto é, em
${BASH_REMATCH[1]}
tem o dia e em ${BASH_REMATCH[2]}
tem o mês. Quando
listamos ${BASH_REMATCH[@]}
mostramos todos os índices do vetor.
Além disso que vimos, é muito fácil manipular tudo que conhecemos a regra (o que venho chamando de padrão), como endereço de e-mail, site, CEP, endereço IP, endereço mac, variáveis do sistema (começam por cifrão e só podem ter letras maiúsculas e/ou alguns caracteres especiais após).
Costumo dizer - e tenham certeza que isso é uma verdade - que você só descobre a imensa quantidade de usos e de economia de código propiciada pelas Expressões Regulares depois que as conhece e sabe usá-las
Para finalizar, um cartoon sobre expressões regulares, de autoria de Randall Munroe, criador da série Xkcd:
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários