Você provavelmente já utiliza o casamento de
padrões sem mesmo conhecê-lo. Quando especifica um arquivo no
Windows®, ou quando procura por um arquivo, você utiliza o caractere
* para espedificar uma string variável. Por exemplo,
*.txt "casa" com todos os arquivos cujos nomes terminem
em .txt. Também utilizamo-nos dele várias vezes na última
seção. Entretanto, existem muitos outros casamentos de padrão além do
*.
Quando você digita um comando como
ls *.txt e pressiona Enter,
a tarefa de encontrar quais arquivos casam com o padrão *.txt
não é feita pelo comando ls, mas sim pelo próprio shell. Aqui
se faz necessária uma pequena explicação de como a linha de comando é
interpretada pelo shell. Quando você digita:
$ ls *.txt readme.txt recipes.txt
a linha de comando é inicialmente dividida em palavras
(ls e *.txt nesse exemplo). Quando o
shell encontra um * em uma palavra, ele irá interpretar a
palavra inteira como um casamento de padrões e irá substituir ela pelos
nomes de todos os arquivos que casem com aquele padrão. Então, o comando,
exatamente antes de ser executado pelo shell se tornou ls
readme.txt recipe.txt, que retorna o resultado esperado. Outros
caracteres fazem com que o shell também reaja dessa maneira:
?: casa com um e somente
um caractere, independente de qual caractere seja;
[...]: casam qualquer caractere
encontrado nos parênteses. Os caracteres podem referenciar ou uma
faixa de valores (i.e. 1-9) ou valores
discretos, ou ainda ambos. Por exemplo:
[a-zBE5-7] irá casar todos os caracteres que estejam entre
a e z, um B,
um E, um 5, um
6 ou um 7;
[!...]: casa qualquer
caractere que não esteja dentro dos colchetes.
[!a-z], por exemplo, irá casar qualquer caractere que
não seja uma letra minúscula[14];
{c1,c2}:
casa c1 ou c2, onde
c1 e c2também são padrões de
casamento, o que quer dizer que você pode escrever, por exemplo,
{[0-9]*,[acr]} .
Alguns padrões e seus significados:
/etc/*conf: todos os
arquivos no diretório /etc cujos nomes terminem em
conf. Pode casar com
/etc/inetd.conf,
/etc/conf.linuxconf, e também
/etc/conf se esse arquivo existir.
Lembre-se que o * também pode casar com qualquer
string vazia.
image/{cars,space[0-9]}/*.jpg:
todos os nomes que terminem em .jpg nos diretórios
image/cars, image/space0,
(...), image/space9, caso esses diretórios
existam.
/usr/share/doc/*/README:
todos os arquivos com nome README em todos os
subdiretórios de primeiro nível abaixo do diretório
/usr/share/doc. Irá casar com
/usr/share/doc/mandriva/README, porém, não irá
casar com /usr/share/doc/myprog/doc/README.
*[!a-z]: todos os
arquivos com nomes que não terminem com uma letra
mínuscula no diretório corrente.
[14] Cuidado! Enquanto que isso é verdade para a maioria
das linguagens, pode não ser verdade para a sua própria
configuração de linguagem (localização). Isso
depende da ordem de combinação. Em algumas
configurações de linguagens, [a-z] irá casar a, A, b, B,
(...), z. E lembre-se do fato que algumas linguagens também tem
caracteres acentuados ...