Outros operadores úteis
Para casar algum caracter de uma lista, use [ ] Veja:
"[Hh]ello" casa com linhas contendo "hello" ou "Hello"
Faixas de caracteres também são permitidos:
[0-3] é o mesmo que [0123]
[a-k] é o mesmo que [abcdefghijk]
[A-C] é o mesmo que [ABC]
[A-Ca-k] é o mesmo que [ABCabcdefghijk]
Existem também algumas formas alternativas:
[[:alpha:]] é o mesmo que [a-zA-Z]
[[:upper:]] é o mesmo que [A-Z]
[[:lower:]] é o mesmo que [a-z]
[[:digit:]] é o mesmo que [0-9]
[[:alnum:]] é o mesmo que [0-9a-zA-Z]
[[:space:]] casa com qualquer quantidade de espaços,
inclusive tabulações
Essas formas alternativas, como [[:digit:]] é
preferível ao método direto, [0-9].
Os [ ] podem ser usado para indicar caracteres que
NÃO devem estar na expressão. É só
colocar o sinal ^ na primeira posição da lista.
Veja:
neo@matrix:~$ echo hello | grep "[Hh]ello"
hello
neo@matrix:~$ echo hello | grep "[^Hh]ello"
neo@matrix
Outro exemplo, um pouco mais complicado:
grep "([^()]*)a" file retorna qualquer linha contendo um
par de parentes seguido por "a" e que NÃO contenham
outros parênteses dentro. Assim, ele casa com essas
linhas:
(hello)a
(aksjdhaksj d ka)a
Mas não com: x=(y+2(x+1))a
Casando com um número especifico de
repetições
Suponha que você queira casar um número
específico de repetições de uma
expressão. Um bom exemplo são números de
telefones. Você pode procurar por um número de
telefone com sete dígitos, assim:
grep "[:digit:]\{3\}[ -]\?[:digit:]\{4\}" file
Ou seja, três dígitos, opcionalmente um
espaço ou um hífen e mais 4 dígitos.
Procurando por começo e fim de linha:
Isso é muito interessante. Digamos que você
queira procurar por linhas que contendo espaços em
brancos no começo da linha, a palavra hello e então
o fim da linha. Vamos começar com este exempo:
>cat file
hello
hello world
hhello
>grep hello file
hello
hello world
hhello
Isso não é o que nós queremos. O que
está errado ? O problema é que o grep procura por
linhas contendo a string hello e todas as linhas
especificadas contem ela. Para contornar isso, introduzimos
os caracteres de começo e fim de linha:
"O caracter ^ significa começo de linha e o $
significa fim da linha"
Retornando ao nosso exemplo:
grep "^[[:space:]]*hello[[:space:]]*$" file
Ou seja, o começo da linha, qualquer quantidade de
espaço em branco (inclusive zero), a palavra hello,
qualquer quantidade de espaço em branco e o fim da
linha. Essa expressão faz o que a gente quer, retornando
somente a linha que contém a palavra hello. Outro
exemplo:
grep "^From.*Alex" /var/spool/mail/neo
Procura no meu inbox por mensagens de uma pessoa em
particular (no caso, Alex). Esse tipo de expressão
regular é extremamente útil e filtros de e-mail,
como o procmail, utilizam isso para fazerem tudo.
Isso ou Aquilo: Procurando uma coisa OU outra:
"A expressão consistindo de duas expressões
separadas pelo operador OU \| casa linhas contendo uma das
duas expressões"
Note que você DEVE colocar a expressão dentro de
aspas simples ou duplas:
grep "cat\|dog" file casa com linhas contendo a palavra "cat" ou a
palavra "dog"
grep "I am a \(cat\|dog\)" casa com linhas contendo a string "I am
a cat" ou a string "I am a dog".