Avançando para expressões
regulares
Os coringas são o começo, mas a idéia vai
mais longe. Por exemplo, suponha que queremos uma
expressão que case com Frederic Smith ou Fred Smith, ou
seja, a string "eric" é opcional.
Primeiro, introduzimos o conceito de um "caracter escapado
(escaped character)".
"Um caracter escapado é um caracter precedido por
uma barra invertida ( \ ). Essa barra invertida faz o
seguinte: (a) Remove qualquer significado especial do
caracter. (b) acrescenta um significado especial a um
caracter que não tenha um significado especial."
Parece complicado, mas veja nos exemplo que é um
tanto quanto simples:
Para procurar uma linha contento o texto "hello.gif", o
comando correto seria:
grep 'hello\.gif' file
Desde que "grep 'hello.gif' file" iria resultar linhas
contendo: hello-gif , hello1gif , helloagif , etc.
Ou seja, a barra invertida remove o significado especial
do ".", passando esse a significar um simples ponto ao
invés de um coringa.
Agora vamos passar para expressões agrupadas, a fim
de encontrar um jeito de criar uma expressão que case
com Frederic ou Fred. Primeiro vamos começar com o
operador "?":
"Uma expressão consistindo de caracter seguido por
uma interrogação escapada ( \? ) casa com zero ou
uma instância daquele caracter".
Exemplo:
"bugg\?y" casa com o seguinte: bugy , buggy mas não com
bugggy
neo@matrix:~$ echo bugy | grep "bugg\?y"
bugy
neo@matrix:~$ echo bugggy | grep "bugg\?y"
neo@matrix:~$
Agora vamos para expressões agrupadas. No nosso
exemplo, queremos tornar opcional a string "eric" após
"Fred", ou seja, não apenas um caracter mas sim um
conjunto de caracteres (string).
"Uma expressão dentro de parênteses escapados
é tratada como um único caracter"
Exemplos:
"Fred\(eric\)\?" Smith casa com "Fred Smith" or "Frederic Smith"
\(abc\)* casa com abc , abcabcabc, etc (isto é, qualquer
número de repetições da string "abc", incluindo
zero).
Note que temos que tomar cuidado quando nossas
expressões contém espaços em branco. Quando
eles aparecem, precisamos colocar a expressão entre
aspas, para que o shell não interprete mal nosso
comando. Para o exemplo acima:
grep "Fred\(eric\)\? Smith" file
Eu aconselho fortemente a sempre usar aspas, mesmo que
não usemos espaços em brancos. Já tive muita
dor de cabeça porque expressões e comandos não
funcionavam simplesmente por não estarem entre aspas. Um
dos exemplo acima (o do bugg\?y) não funciona no meu
sistema se não estiver entre aspas. Veja:
neo@matrix:~$ echo bugy | grep "bugg\?y"
bugy
neo@matrix:~$ echo bugy | grep bugg\?y
neo@matrix:~$