Enquanto usamos *
para indicar zero ou mais caracteres anteriores grep
, usamos *.c
para encontrar todos os arquivos C quando o usamos com o ls
comando like ls *.c
. Alguém poderia dizer como o uso de *
difere nesses dois casos?
O globbing do nome do arquivo do shell e as expressões regulares usam alguns dos mesmos caracteres, e eles têm finalidades semelhantes, mas você está certo, eles não são compatíveis. O globbing de nome de arquivo é um sistema muito menos poderoso.
No nome do arquivo globbing:
*
significa "zero ou mais caracteres"
?
significa "qualquer caractere único"
Mas nas expressões regulares, você deve usar .*
para significar "zero ou mais caracteres" e .
significa "qualquer caractere único". A ?
significa algo bem diferente nas expressões regulares: zero ou uma instância do elemento RE anterior.
Os colchetes ( []
) parecem funcionar da mesma forma nos dois sistemas no sistema em que estou digitando isso, pelo menos em casos simples. Isso inclui coisas como classes de caracteres POSIX (por exemplo [:alpha:]
). Dito isto, se você precisar que seus comandos funcionem em muitos tipos diferentes de sistemas, recomendo não usar nada além de coisas básicas, como listas de caracteres (por exemplo [abeq]
) e talvez intervalos de caracteres (por exemplo [a-c]
).
Essas diferenças significam que os dois sistemas são apenas intercambiáveis diretamente para casos simples. Se você precisar de correspondência regex de nomes de arquivo, precisará fazê-lo de outra maneira. find -regex
é uma opção. (Observe que também há find -name
, a propósito, que usa sintaxe glob.)
'%'
os meios'*'
.Respondendo à pergunta expressa no título original:
A expansão do nome do arquivo é anterior às expressões regulares, já existia na maioria dos sistemas operacionais (caracteres curinga / coringa) e é muito mais simples e intuitiva que a última.
Embora
*.txt
seja facilmente compreensível por usuários casuais, o análogo.*\.txt
é algo mais direcionado a usuários / programadores experientes, sem mencionar^.*\.txt$
...fonte
*.txt
não é igual.*\.txt
, é (principalmente) igual a.*\.txt$
porque não pode haver nada após o.txt
(pelo menos assumindo um nome razoável do arquivo). Talvez até^.*\.txt$
um pouco, dependendo do uso. Prova o seu ponto?