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

11

Embora usemos * para denotar zero ou mais caracteres anteriores em grep , usamos *.c para localizar todos os arquivos C quando usá-lo com o comando ls , como ls *.c . Alguém poderia dizer como o uso de * difere nesses dois casos?

    
por user3539 08.12.2012 / 13:52

2 respostas

27

globbing de nome de arquivo da shell e expressões regulares usam alguns dos mesmos caracteres e têm propósitos semelhantes, mas você tem razão, eles não são compatíveis. A globulação de nomes de arquivos é um sistema muito menos poderoso.

Na globulação do nome do arquivo:

  • * significa "zero ou mais caracteres"

  • ? significa "qualquer caractere único"

Mas nas expressões regulares, você precisa usar .* para significar "zero ou mais caracteres" e . significa "qualquer caractere único". Um ? significa algo bem diferente em expressões regulares: zero ou uma instância do elemento RE anterior.

Os colchetes ( [] ) parecem funcionar da mesma forma em ambos os sistemas no sistema em que estou digitando, para casos simples, pelo menos. Isso inclui coisas como classes de caracteres POSIX (por exemplo, [:alpha:] ). Dito isso, se você precisar que seus comandos trabalhem com vários tipos de sistema, recomendo que não use nada além de itens elementares, 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 de nomes de arquivos, você precisará fazer isso de outra maneira. find -regex é uma opção. (Observe que também há find -name , que usa a sintaxe glob.)

    
por 08.12.2012 / 14:02
10

Respondendo à pergunta expressa no título original:

Why do regular expressions differ from that used to filter files?

A expansão do nome do arquivo é anterior às expressões regulares, já existia na maioria dos sistemas operacionais (caracteres wildcard / joker) e é muito mais simples e intuitiva do 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$ ...

    
por 01.01.2013 / 11:44

Tags