Usando backreference (referencia
anterior)
Digamos que você queira procurar strings que
contenham uma substring em mais de um lugar. Um exemplo
é as tags de cabeçalhos de HTML. Suponha que eu
queira procurar por "<H1>alguma string</H1>".
Isto é fácil de se fazer. Mas suponha que eu queira
fazer o mesmo, mas permita H2 H3 H4 H5 e H6 no lugar de H1. A
expressão <H[1-6]>.*</H[1-6]> não
é boa, desde que casa com "<H1>alguma
string</H3>" e nos queremos que a tag de abertura seja
igual a de fechamento. Para fazermos isso, usamos
backreference:
"A expressão \n onde n é um número, casa
com o conteúdo do n-ésimo conjunto de
parênteses na expressão".
Nossa... isso realmente precisa de um exemplo!!!!
<H\([1-6]\)>.*</H\1> faz o que nos
queríamos fazer acima...
"O Senhor \(dog\|cat\) e a senhora \1 foram visitar o
Senhor \(dog\|cat\) e a senhora \2"
Esse é outro exemplo bobo. Os casais tem sempre que
serem iguais. Ou um casal de cachorro ou de gato.
Alguns detalhes cruciais: caracteres especiais
e aspas
Caracteres Especiais:
Aqui nós descrevemos os caracteres especiais para
RegExp (expressões regulares) no grep. Note que no
"egrep", que usa expressões regulares estendidas
(atualmente não tem nenhuma funcionalidade a mais que as
expressões regulares normais do GNU grep), a lista de
caracteres especiais são os mesmos, diferindo somente
que alguns não precisar estar "escapados".
Os seguintes caracteres são considerados especiais, e
precisam estar escapados:
? \ . [ ] ^ $
Note que o sinal de $ perde seu sentido se tiver
caracteres depois dele, do mesmo jeito que o sinal ^ perde
seu sentido se tiver caracteres antes dele. Os colchetes [ ]
comportam-se um pouco diferente. A baixo segue as regras para
eles:
- O colchete direito ( ] ) perde seu sentido especial se
colocado no começo de uma lista, por exemplo: "[]12]"
casa com ] , 1, or 2.
- Um hífen perde seu significado especial se
colocado por último. Assim, [15-] casa com 1, 5 ou
-
- O caracter ^ perde seu sentido se não for colocado
em primeiro lugar.
- A maioria dos caracteres especiais perdem seu
significado especial se forem colocados dentro de
colchetes.
Aspas:
Em primeiro lugar, aspas simples são mais seguras de
usar porque elas protegem suas expressões regulares de
serem alteradas pelo bash (como foi visto nas aulas
anteriores). Por exemplo, grep "!" file vai produzir um erro,
já que o shell pensa que "!" está se referindo ao
comando de histórico do shell, enquanto grep '!' file
funciona perfeitamente.
Quando você deve usar aspas simples ? A resposta
é: se você precisa usar variáveis do shell,
use aspas duplas. Caso contrário, use aspas simples. Por
exemplo:
grep "$HOME" file
Procura em file pelo nome do seu diretório pessoal,
enquanto
grep '$HOME' file
procura pela string $HOME.
Sintaxe das expressões regulares
estendidas
Agora vamos ver a sintaxe do egrep em contraste com a
sintaxe do grep. Ironicamente, apesar do nome "estendido", o
egrep atualmente tem menos funcionalidade do que quando foi
criado, para manter a compatibilidade com o tradicional grep.
A melhor maneira de fazer um grep estendido é utilizar
grep -E que usa a sintaxe de expressões regulares
estendidas sem perda de funcionalidade.
Bom, espero que vocês tenham tido uma boa idéia
de como funcionam as expressões regulares. Elas são
extremamente importante, principalmente para utilizar o grep
e o poderosíssimo sed, do qual trataremos na
próxima aula. Não se preocupem se estiverem confuso
com as expressões, quando começarem a
utilizá-las, as idéias vão clareando. Até
a próxima.