Expressões regulares VS globbing do nome do arquivo

15

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

Hamza
fonte

Respostas:

19

Expressões regulares e globbing de nome de arquivo 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.

O globbing do nome do arquivo é usado pelos shells para combinar nomes de arquivos e diretórios usando curingas. As capacidades de globbing dependem da casca. O Bash, por exemplo, suporta caracteres curinga como:

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

Esses curingas podem parecer semelhantes às expressões regulares e, na verdade, [...]têm o mesmo significado em globbing e regex. Mas *e ?significa coisas diferentes em globbing e regex.

Em um comentário que você escreveu:

mas como a diferença do intérprete * seja um coringa ou uma expressão regular? por exemplo grep a*b a*.txt:?

Fácil. Tipo de.

Primeiro, o shell tenta interpretar os curingas, combinando-os com os nomes de arquivos. Se houver arquivos começando com "a" e terminando com "b", o shell será substituído a*bpelos nomes de arquivos correspondentes. O mesmo vale para a*.txt. Se não houver nomes de arquivos correspondentes, o shell transmitirá os argumentos grepcomo eram, literalmente.

No entanto, o primeiro parâmetro de grepdeve ser um padrão. Em 99,999% dos casos de uso prático, você não deseja 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 a*b, o shell não o interpretará usando globbing e, em vez disso, o passará diretamente para grep. Por sua vez, grepinterpretará 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 caracteres curinga. Comandos, programas interpretam seus parâmetros da maneira que foram projetados por seus autores.

janos
fonte
4

Se um nome de arquivo for uma sequência para você, você poderá usar regex também para nomes de arquivos. Por exemplo: se você deseja encontrar nomes de arquivos correspondentes a um regex, tente:

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

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

ninguém
fonte
mas como a diferença do intérprete * seja um coringa ou uma expressão regular? por exemplo: $ grep a "asterix" b a "asterix" .txt
Hamza
2
Se você usar, find ./ -name 'a*'use * como um curinga. Ao digitar find ./ -regex 'a*', você usa * em uma regex. A diferença importante é a troca -nameou -regex.
ninguém