(caracteres que tem um significado especial ao sistema)
Metacaracteres e Wildcards são caracteres que tem um significado especial ao sistema. Esses caracteres são:
- * (asteristico);
- ? (ponto de interrogação);
- . (ponto final);
- + (mais);
- ^ (circunflexo - inicio - negação);
- $ (cifrão - final);
- | (ou - or);
- & (e - and);
- ( ) (parentese - grupo);
- [ ] (colchetes - lista);
- { } (chaves);
- \ (escape);
Antes de começar é necessário saber a diferença entre Metacaracteres e Wildcard. Metacaracteres são caracteres especiais que são usados com comandos que manipulam texto. Já os Wildcards são caracteres especiais que são usados com comandos que manipulam arquivos e diretórios, ou seja, comandos que manipulam os nomes dos arquivos e diretórios.
Os wildcards são caracteres especiais usados com comandos que manipulam arquivos, ou seja, comandos que manipulam os nomes dos arquivos e diretórios. Alguns comandos muito utilizados que usam wildcards são: find, cp, mv, rm, ls, cat, grep etc.
- * (asterisco): representa nenhum (zero) ou infinitos caracteres qualquer. Ex: texto.* é igual a texto.txt, texto.doc, texto., texto.t, texto.aaa, texto.xxxxxxx, texto.012345.lll_aab-2012.rtf etc;
- ? (ponto de interrogação): representa um caracter qualquer. Deve sempre existir um caracter. Ex1: texto.tx? é igual a texto.txt, texto.txT, texto.txa, texto.tx9, texto.tx_ etc. Ex2: texto.??? é equivalente a texto.txt, texto.123, texto.abc, texto.u_T etc;
- [ ] (colchetes): lista permitida de caracteres. Substitui somente um caracter que esteja dentro da lista/colchetes. Ex1: 12345678[9][0] é igual a 1234567890. Ex: 12345678[90] é igual a 123456789 e 123456780. Ex3: texto.[td][xo][tc] é igual a texto.txt, texto.doc, texto.txc, texto.tot, texto.dxt, texto.dot etc. Também se pode usar intervado respeitando a tabela ASCII, conforme a lista a seguir.
- [0-9] igual a [0123456789]
- [1-6] igual a [123456]
- [a-z] igual a [abcdefghijlmnopqrstuvxwyz]
- [a-e] igual a [abcde]
- [A-Z] igual a [ABCDEFGHIJLMNOPQRSTUVXWYZ]
- [a-zA-Z] igual a [abcdefghijlmnopqrstuvxwyzABCDEFGHIJLMNOPQRSTUVXWYZ]
- [a-zA-Z0-9] igual a [abcdefghijlmnopqrstuvxwyzABCDEFGHIJLMNOPQRSTUVXWYZ0123456789]
- [A-z] igual a [abcdefghijlmnopqrstuvxwyzABCDEFGHIJLMNOPQRSTUVXWYZ[]\^_]
- ABAIXO TEM A CLASSE DE CARACTERES POSIX - ELES RESPEITAM O LOCALE:
- [[:lower:]] igual a [a-z]
- [^[:lower:]] diferente de [a-z]
- [[:upper:]] igual a [A-Z]
- [[:alpha:]] igual a [a-zA-Z]
- [[:alnum:]] igual a [a-zA-Z0-9]
- [[:digit:]] igual a [0-9]
- [[:xdigit:]] igual a [0-9A-Fa-f] - hexadecimal
- [[:space:]] igual a [\t\n\r\f\v]
- [[:blank:]] igual a [\t] - espaço e TAB
- [[:cntrl:]] igual a "-" - caracter de controle
- [[:print:]] igual a [^\t\n\r\f\v] - caracteres imprimíveis e espaço
- [[:graph:]] igual a [^\t\n\r\f\v] - caracteres imprimíveis
- [[:punct:]] igual a [.,!?:...] - sinais de pontuação
Obs1: CASE-SENSITIVE E CASE-INSENSITIVE. Para que os intervalos (ex: [a-z]) funcionem corretamente é importante que o comando (ex: find) implemente o case-sensitive (ex: -name). Por exemplo, com o comando "find" o correto é usar algo do tipo "find /etc/ -name cron.[a-z]" ao invés de "find /etc/cron.[a-z] -maxdepth 0", pois o find sem a opção name é case-insesitive. Geralmente comandos que implementam o case-sensitive também implementa o case-insensitive como "find -iname", "grep -i" etc. Para conhecimento, os comandos ls, cp, rm, mv não tem a opção para case-insensitive.
Obs2: LOCALE. Os intervalos (ex: [a-z]) respeitam o locale. Por exemplo, o comando "LANG=C find /etc/ -name cron.[a-z]" é diferente de "LANG=pt_BR.utf8 find /etc/ -name cron.[a-z]", pois o primeiro é o padrão POSIX (internacional) e o segundo é o padrão PORTUGUÊS/BRASILEIRO UNICODE que englobla os acentos (ex: á, Í etc). O UTF-8 engloba a acentuação. Já a ISO88591 e ISO885915 não;
Obs3: COMANDOS QUE SÃO CASE-INSENSITIVE. Para os comandos que são case-insensitive por natureza (ls, cp, rm, mv, find sem o "name" etc) se pode usar o comando sh -c "command" que o intervalo (ex: [a-z]) vai funcionar. Apesar disso, com o comando "sh -c" o locale será sempre o POSIX (LANG=C).
- [^ ] (colchetes e circunflexo): lista proibida de caracteres. Substitui um caracter que não esteja dentro da lista/colchetes. Ex: texto.[^o][^d][^t];
- [! ] (colchetes e exclamação): idem;
- { } (chaves): lista um grupo de dois ou "n" caracteres (ou conjunto de caracteres) iguais ou diferentes. Os integrantes desse grupo devem ser separados por vírgula. Ex1: texto.{txt,doc} é igual a texto.txt e texto.doc. Ex2: texto.{txt,doc,odt,docx} é igual a texto.txt, texto.doc, texto.odt e texto.docx. Ex3: texto.{txt,txt,txt,doc,odt,docx} é igual a texto.txt, texto.txt, texto.txt, texto.doc, texto.odt e texto.docx. As chaves também aceita wildcards, por exemplo, {?,?}, {*,?}, {a,?}, {?,?}*, {[dx],d}, {[^dx],d} etc.
EXEMPLOS PRÁTICOS
# ls -d /etc/cron.* (mostra "/etc/cron.d", "/etc/cron.daily", "/etc/cron.hourly", /etc/cron.monthly" e "/etc/cron.weekly")
# ls -d /etc/cron.? (mostra "/etc/cron.d")
# ls -d /etc/cron.[d] (mostra "/etc/cron.d")
# ls -d /etc/cron.d* (mostra "/etc/cron.d" e "/etc/cron.daily")
# ls -d /etc/cron.[^d]* (mostra "/etc/cron.hourly", /etc/cron.monthly" e "/etc/cron.weekly")
# ls -d /etc/cron.[!d]* (idem)
# ls -d /etc/cron.*[y] (mostra "/etc/cron.daily", "/etc/cron.hourly", "/etc/cron.monthly" e "/etc/cron.weekly")
# ls -d /etc/cron.[dw]* (mostra "/etc/cron.d", "/etc/cron.daily" e "/etc/cron.weekly")
# ls -d /etc/cron.{d,w}* (idem)
# ls -d /etc/cron.{d,weekly}* (idem)
# ls -d /etc/cron.{d,weekly,monthly}* (idem, só que mostra também o "/etc/cron.monthly")
# ls -d /etc/cron.{d,w,w}* (mostra "/etc/cron.d", "/etc/cron.daily", "/etc/cron.weekly", "/etc/cron.weekly" e "/etc/cron.weekly")
# ls -d /etc/cron.{d,?} (mostra "/etc/cron.d" e "/etc/cron.d")
# ls -d /etc/cron.{d,?}* (mostra /etc/cron.d /etc/cron.daily /etc/cron.hourly /etc/cron.weekly /etc/cron.d /etc/cron.daily /etc/cron.monthly)
# ls -d /etc/cron.{[^dx],d}* (mostra /etc/cron.d /etc/cron.daily /etc/cron.hourly /etc/cron.monthly /etc/cron.weekly)
# cat /etc/rc.local ; ls !$ (último argumento passado, ou seja, o "!$" será substituído por "/etc/rc.local")
Os metacaracteres são caracteres especiais usados com comandos que manipulam textos. Alguns comandos muito utilizados que usam metacaracteres são: grep etc.
- * (asterisco): o caracter anterior ao "*" poderá não aparecer, aparecer uma vez ou infinitas vezes. Ex1: texto* = text, texto, textoo, textooo, textoooo, .... Ex2: 10* = 1, 10, 100, 1000, 10000, 100000, ...;
- ? (ponto de interrogação): o caracter anterior ao "?" poderá aparecer uma vez ou não aparecer. Ex1: texto? = texto e text. Ex2: 10? = 1 10;
- + (soma): o caracter anterior ao "*" poderá aparecer uma vez ou infinitas vezes. Ex1: texto+ = texto, textoo, textooo, textoooo, .... Ex2: 10+ = 10, 100, 1000, 10000, 100000, ...;
- . (ponto final): representa um caracter qualquer. Deve sempre existir um caracter no lugar do ".". Ex1: text. = texto, text1, text2, texta, textb, textc etc. Ex2: 10. = 100, 101, 102, 103, 10a, 10b etc ;
- .* (ponto final e asterisco): representa nenhum (zero) ou infinitos caracteres qualquer. Ex: texto.* = texto, texto.txt, texto.doc, textos, texto.t, texto.aaa, textoxxxxxxx, texto012345.lll_aab-2012.rtf etc. Ex2: 10.* = 100, 101, 102, 1033333, 10aaa, 10abb, 10falkjdsa.000aaa etc;
- [ ] (colchetes): idem ao exposto anteriormente em WILDCARD, menos ao conceito da 'Obs3' relacionada ao 'sh -c';
- [^ ] (colchetes e circunflexo): idem ao exposto anteriormente em WILDCARD, menos ao conceito da 'Obs3' relacionada ao 'sh -c';
- [! ] (colchetes e circunflexo): idem ao exposto anteriormente em WILDCARD, menos ao conceito da 'Obs3' relacionada ao 'sh -c';
- ^ (circunflexo): início de linha. Ex1: ^texto = texto, texto.txt, textotxt, texto123, textoZZZZZ;
- $ (cifrão): fim de linha. Ex1: texto$ = texto, aaaa.texto, 123texto, ZZZZzzztexto, txt.texto, 12Zasdjfafdlkjtexto;

Referências Bibliográgicas