Expressions régulières VS globbing de nom de fichier

15

Je sais que les expressions régulières ne doivent être utilisées qu'avec des caractères et des chaînes, mais parfois je les trouve dans les noms de fichiers. Ma question est la suivante: les expressions rationnelles ne sont-elles utilisées qu'avec des caractères ou également avec des noms de fichiers?

Hamza
la source

Réponses:

19

Les expressions régulières et la globalisation des noms de fichiers sont deux choses très différentes.

Les expressions régulières sont utilisées dans les commandes / fonctions pour la correspondance de motifs dans le texte. Par exemple dans le paramètre pattern de grep, ou dans les langages de programmation.

Le remplacement de nom de fichier est utilisé par les shells pour faire correspondre les noms de fichiers et de répertoires à l'aide de caractères génériques. Les capacités de globbing dépendent du shell. Bash, par exemple, prend en charge les caractères génériques comme:

  • * correspondre à 0 ou plusieurs caractères
  • ? correspondre à 1 caractère
  • [...] faire correspondre un caractère de l'ensemble spécifié

Ces caractères génériques peuvent ressembler à des expressions régulières, ont en [...]fait la même signification dans le globbing et regex. Mais *et ?signifient des choses différentes en globbing et regex.

Dans un commentaire que vous avez écrit:

mais comment la différence interprète * que ce soit un joker ou regex? par exemple grep a*b a*.txt:?

Facile. Sorte de.

Tout d'abord, le shell essaie d'interpréter les caractères génériques, en les comparant aux noms de fichiers. S'il existe des fichiers commençant par "a" et se terminant par "b", le shell sera remplacé a*bpar les noms de fichiers correspondants. Il en va de même a*.txt. S'il n'y a aucun nom de fichier correspondant, le shell passera les arguments greptels qu'ils étaient, littéralement.

Cependant, le premier paramètre de grepdevrait être un modèle. Dans 99,999% des cas d'utilisation pratiques, vous ne voulez pas que le premier paramètre soit interprété par le shell. Donc, très probablement, l'intention était la suivante:

grep "a*b" a*.txt

Grâce à la citation a*b, le shell ne l'interprétera pas à l'aide de la globalisation, et le passera directement à grep. À son tour, grepinterprétera cela comme une expression régulière (par conception).

Pour résumer, le shell interprète la ligne de commande en suivant son propre langage de globalisation, qui utilise des caractères génériques. Les commandes, les programmes interprètent leurs paramètres de la manière dont ils ont été conçus par leurs auteurs.

janos
la source
4

Si un nom de fichier est une chaîne pour vous, vous pouvez également utiliser l'expression régulière pour les noms de fichiers. Par exemple: si vous voulez trouver des noms de fichiers correspondant à une expression régulière, vous pouvez essayer:

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

La commande recherche les fichiers dont le nom a, b ou c suivi de x, y ou z. Ce n'est qu'un exemple. Les possibilités sont infinies.

personne
la source
mais comment la différence interprète * que ce soit un joker ou regex? par exemple: $ grep a "asterix" b a "asterix" .txt
Hamza
2
Si vous utilisez, find ./ -name 'a*'vous utilisez * comme caractère générique. Lorsque vous tapez find ./ -regex 'a*', vous utilisez * dans une expression régulière. La différence importante est le commutateur -nameou -regex.
personne