Expressões regulares VS Globo de nome de arquivo

9

Eu sei que expressões regulares devem ser usadas apenas com caracteres e strings, mas às vezes eu as encontro nos nomes dos arquivos. Minha pergunta é: são regexes somente usados com caracteres ou também com nomes de arquivos?

    
por Hamza 29.12.2015 / 10:38

2 respostas

13

Expressões regulares e globbing de nomes de arquivos são duas coisas muito diferentes.

Expressões regulares são usadas em comandos / funções para correspondência de padrões no texto. Por exemplo, no parâmetro padrão de grep ou nas linguagens de programação.

A globbing de nomes de arquivos é usada por shells para corresponder nomes de arquivos e diretórios usando curingas. Os recursos de globbing dependem do shell. O Bash, por exemplo, suporta curingas como:

  • * corresponde a 0 ou mais caracteres
  • ? corresponde a 1 caractere
  • [...] corresponde a um caractere no conjunto especificado

Esses curingas podem ser semelhantes a expressões regulares, de fato [...] tem o mesmo significado em globbing e regex. Mas * e ? significam coisas diferentes em globbing e regex.

Em um comentário que você escreveu:

  

mas como a diferença do intérprete * se é um joker ou regex? por exemplo: grep a*b a*.txt ?

Fácil. Mais ou menos.

Antes de mais nada, o shell tenta interpretar os curingas, combinando-os com nomes de arquivos. Se houver arquivos começando com "a" e terminando com "b", o shell substituirá a*b pelos nomes de arquivos correspondentes. O mesmo vale para a*.txt . Se não houver nomes de arquivos correspondentes, o shell passará os argumentos para grep como eram, literalmente.

No entanto, o primeiro parâmetro de grep deve ser um padrão. Em 99,999% dos casos de uso prático, você não quer que o primeiro parâmetro seja interpretado pelo shell. Então, provavelmente, a intenção era esta:

grep "a*b" a*.txt

Graças à citação de a*b , o shell não irá interpretá-lo usando globbing e passará diretamente para grep . Por sua vez, grep interpretará isso como uma expressão regular (por design).

Para resumir, o shell interpreta a linha de comando seguindo sua própria linguagem globbing, que está usando curingas. Comandos, programas interpretam seus parâmetros da maneira que foram projetados por seus autores.

    
por janos 29.12.2015 / 11:39
4

Se um nome de arquivo é uma string para você, você pode usar o regex também para nomes de arquivos. Por exemplo: se você quiser encontrar nomes de arquivos que correspondam a uma expressão regular, tente:

find ./ -regex '.*[abc][xyz].*'

O comando procura arquivos que tenham a, b ou c no nome seguido por x, y ou z. isso é apenas um exemplo. Existem infinitas possibilidades.

    
por nobody 29.12.2015 / 10:51