Como as expressões regulares diferem dos curingas usados ​​para filtrar arquivos

15

Enquanto usamos *para indicar zero ou mais caracteres anteriores grep, usamos *.cpara encontrar todos os arquivos C quando o usamos com o lscomando like ls *.c. Alguém poderia dizer como o uso de *difere nesses dois casos?

user3539
fonte

Respostas:

30

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.)

Warren Young
fonte
2
Eu não sei o que foi chamado englobamento :)
user3539
3
Além disso, existem vários sabores de regex. Nem todas as regexes são criadas da mesma forma! E você tem muitos outros sistemas padrão de harmonização, tais como SQL como , onde '%'os meios '*'.
Lister
4
Dois principais sabores do regexp são POSIX e PCRE (Perl Compatible RE). O último é menos demorado e possui mais alguns recursos. As ferramentas e shells do Unix geralmente usam POSIX, a maioria das linguagens de programação com regexps embutidos (exceto shell) usa PCRE. Apenas tome cuidado com a diferença ao ler o material on-line.
Goldilocks
11

Respondendo à pergunta expressa no título original:

Por que as expressões regulares diferem das usadas para filtrar arquivos?

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 *.txtseja facilmente compreensível por usuários casuais, o análogo .*\.txté algo mais direcionado a usuários / programadores experientes, sem mencionar ^.*\.txt$...

jlliagre
fonte
2
Outro motivo para a parte "por que": velocidade. As expressões regulares são mais lentos: pastebin.com/3iNCgkE3
manatwork
3
*.txtnã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?
um CVn 09/01