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*b
par 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 grep
tels qu'ils étaient, littéralement.
Cependant, le premier paramètre de grep
devrait ê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, grep
interpré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.
find ./ -name 'a*'
vous utilisez * comme caractère générique. Lorsque vous tapezfind ./ -regex 'a*'
, vous utilisez * dans une expression régulière. La différence importante est le commutateur-name
ou-regex
.