Prof. Armando Luiz N. Delgado
Uma EXPRESSÃO REGULAR é uma forma compacta de especificar um padrão genérico de caracteres. Existem muitos filtros em UNIX, tais como grep(1), sed(1), awk(1) e vi(1) que usam tanto padrões exatos quanto expressões regulares.
Por exemplo, pode-se usar grep(1) para encontrar em um arquivo por todas as linhas que tenham a letra ``H'', seguida de um número qualquer de letras minúsculas, seguida da letra ``m''.
EXPRESSÕES REGULARES são parte integrante de sistemas UNIX e é EXTREMAMENTE IMPORTANTE aprender como usá-las.
Dentro de uma expressão regular, certos símbolos tem um significado especial, conforme mostrado na tabela 1. Mais símbolos com siginificado especial podem ser encontrado na seção REGULAR EXPRESSIONS no manual on-line de grep(1).
egrep(1) é um outro comando bastante usado no processamento de textos em UNIX.
egrep(1) é uma forma alternativa de grep(1) que utiliza EXPRESSÕES REGULARES EXTENDIDAS (ERE's), em contraponto com EXPRESSÕES REGULARES BÁSICAS (BRE's) usadas por grep(1).
Dentro de uma ERE, certos símbolos tem um significado especial, conforme mostrado na tabela 2. Mais símbolos com siginificado especial podem ser encontrados na seção REGULAR EXPRESSIONS no manual on-line de grep(1)/egrep(1).
|
Com ERE's (comando egrep(1)), não se usa
nestes símbolos especiais.
Eu vi que havia um pinheiro entre a janela e o mar: por quanto tempo o dinheiro iria isto deixar? Pinheiro, sóbrio pinheiro, é tempo de navegar. Balança as folhas, sacode teu porte esguio, natural, presta atenção para o mote da destruição geral; balança que ainda podes do vento colher o sal. Espalha o perfume doce da terra de onde tu vens, como se ainda fosses senhor dos ares que tens, mas reconhece, acabou-se a era dos três vintens. Vintens O que são míseros vintens. Que olhar mais ganancioso. Quisera que desse moedas em um pinheirozito. vintens, nada mais que míseros vintens Prefiro dar uma olhada Nas frondosas galhadas.
ci066@dupond:~$ egrep vintens ~ci066/Arquivos/da_janela.txt
a era dos três vintens.
O que são míseros vintens.
vintens, nada mais que míseros vintens
ci066@dupond:~$ egrep -i vintens ~ci066/Arquivos/da_janela.txt
a era dos três vintens.
Vintens
O que são míseros vintens.
vintens, nada mais que míseros vintens
ci066@dupond:~$ egrep nheiro ~ci066/Arquivos/da_janela.txt
Eu vi que havia um pinheiro
entre a janela e o mar: por quanto tempo o dinheiro
Pinheiro, sóbrio pinheiro,
ci066@dupond:~$
ci066@dupond:~$ egrep 'lha' ~ci066/Arquivos/da_janela.txt
Balança as folhas, sacode
Espalha o perfume doce
Prefiro dar uma olhada
Nas frondosas galhadas.
ci066@dupond:~$
ci066@dupond:~$ egrep 'lha' ~ci066/Arquivos/da_janela.txt
Espalha o perfume doce
ci066@dupond:~$
ci066@dupond:~$ egrep 'lha.' ~ci066/Arquivos/da_janela.txt
Balança as folhas, sacode
Que olhar mais ganancioso.
ci066@dupond:~$ egrep 'lha.?' ~ci066/Arquivos/da_janela.txt
Balança as folhas, sacode
Espalha o perfume doce
Que olhar mais ganancioso.
Prefiro dar uma olhada
Nas frondosas galhadas.
ci066@dupond:~$ egrep 'lhas*' ~ci066/Arquivos/da_janela.txt
Balança as folhas, sacode
Espalha o perfume doce
ci066@dupond:~$ egrep 'lhas?' ~ci066/Arquivos/da_janela.txt
Balança as folhas, sacode
Espalha o perfume doce
ci066@dupond:~$ egrep '[Pp]inheiro
' ~ci066/Arquivos/da_janela.txt
Eu vi que havia um pinheiro
Pinheiro, sóbrio pinheiro,
ci066@dupond:~$ egrep '^Balança' ~ci066/Arquivos/da_janela.txt
Balança as folhas, sacode
ci066@dupond:~$ egrep 'odes?$' ~ci066/Arquivos/da_janela.txt
Balança as folhas, sacode
balança que ainda podes
ci066@dupond:~$ egrep 'ens[,.]*$' ~ci066/Arquivos/da_janela.txt
da terra de onde tu vens,
senhor dos ares que tens,
a era dos três vintens.
Vintens
O que são míseros vintens.
vintens, nada mais que miseros vintens
ci066@dupond:~$ egrep -i '^vintens$' ~ci066/Arquivos/da_janela.txt
Vintens
OBS.: A expressão regular acima seleciona linhas que tenham APENAS o string vintens. A linha vintens, nada mais que míseros vintens NÃO SERÁ selecionada pelo comando.
O motivo é que grep(1) procura por uma seqüência de caracteres que coincida com o padrão indicado na expressão regular. A expressão '^vintens$' diz que a sequência de caracteres a ser encontrada (vintens) deve ser precedida de início de linha e sucedida por um final de linha.
Na linha mencionada, a primeira ocorrência de vintens é precedida por início de linha, mas não é sucedida por final de linha, portanto não corresponde à expressão regular. Da mesma forma a segunda ocorrência de vintens é sucedida por fim de linha, mas não é precedida por um início de linha e também não corresponde à expressão regular.
Na verdade, temos 2 ocorrências da palavra vintens na linha, mas são 2 strings distintos. A lógica de processamento de grep(1) não é visual ou semântica. Este comando processa cada linha como uma seqüência de caracteres e procura sequencialmente na linha pelo padrão indicado na expressão regular.
ci066@dupond:~$ egrep 'H[a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z]*' ~/texto.lst
...
ci066@dupond:~$ egrep 'H[a-zA-Z][a-zA-Z][a-zA-Z]+' ~/texto.lst
...
ci066@dupond:~$ egrep 'H[a-zA-Z]{3,}' ~/texto.lst
...
ci066@dupond:~$ egrep ':.*:' ~/senhas
...
ci066@dupond:~$ egrep '>' ~/.bashrc
mostra apenas linhas com redirecionamento de saída
ci066@dupond:~$ egrep ' |
' ~/.bashrc
ci066@dupond:~$ egrep '[^eiou]*a[^iou]*e[^aou]*i[^aeu]*o[^aei]*u' ~ci066/LabNum7/words
....
ci066@dupond:~$ egrep '[^eiou]*a[^iou]*e[^ou]*i[^u]*o[a-zA-Z]*u' ~ci066/LabNum7/words
....