web-dev-qa-db-fra.com

Expressions régulières contre le nom de fichier

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 regex niquement sont-ils utilisés avec des caractères ou également avec des noms de fichiers?

14
Hamza

Les expressions régulières et la suppression de 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 modèles dans le texte. Par exemple, dans le paramètre pattern de grep ou dans les langages de programmation.

Le nom de fichier globbing est utilisé par les shells pour faire correspondre les noms de fichier et de répertoire à 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 tels que:

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

Ces caractères génériques peuvent ressembler aux expressions régulières, car [...] a la même signification dans les expressions globbing et regex. Mais * et ? signifient des choses différentes dans globbing et regex.

Dans un commentaire que vous avez écrit:

mais quelle est la différence d'interprète *, que ce soit un joker ou une regex? par exemple: grep a*b a*.txt?

Facile. Sorte de.

Tout d’abord, le shell tente d’interpréter les caractères génériques en les comparant avec les noms de fichiers. S'il existe des fichiers commençant par "a" et se terminant par "b", le shell remplacera a*b par les noms de fichier correspondants. Il en va de même pour a*.txt. Si aucun nom de fichier ne correspond, le shell passera littéralement les arguments à grep.

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

grep "a*b" a*.txt

En citant a*b, le shell ne l’interprétera pas à l’aide de globbing, mais le transmettra directement à grep. grep interprétera à son tour cela comme une expression régulière (par conception).

Pour résumer, le shell interprète la ligne de commande en suivant sa propre langue, 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.

19
janos

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

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

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

4
nobody