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 c2
també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 ...