Alors que nous utilisons *
pour indiquer zéro ou plusieurs caractères précédents dans grep
, nous utilisons *.c
pour trouver tous les fichiers C lorsque nous l'utilisons avec le ls
commande comme ls *.c
. Quelqu'un pourrait-il dire comment l'utilisation de *
diffère dans ces deux cas ?
Réponse acceptée :
La globalisation des noms de fichiers Shell et les expressions régulières utilisent certains des mêmes caractères, et ils ont des objectifs similaires, mais vous avez raison, ils ne sont pas compatibles. L'englobement des noms de fichiers est un système beaucoup moins puissant.
Dans le remplacement du nom de fichier :
-
*
signifie "zéro ou plusieurs caractères" -
?
signifie "n'importe quel caractère"
Mais dans les regex, vous devez utiliser .*
pour signifier "zéro ou plusieurs caractères", et .
signifie "n'importe quel caractère". Un ?
signifie quelque chose de tout à fait différent dans les regex :zéro ou une instance de l'élément RE précédent.
Crochets ([]
) semblent fonctionner de la même manière dans les deux systèmes sur le système sur lequel je tape ceci, du moins pour les cas simples. Cela inclut des éléments tels que les classes de caractères POSIX (par exemple, [:alpha:]
). Cela dit, si vous avez besoin que vos commandes fonctionnent sur de nombreux types de systèmes différents, je vous déconseille d'utiliser quoi que ce soit au-delà des choses élémentaires comme des listes de caractères (par exemple, [abeq]
) et peut-être des plages de caractères (par exemple [a-c]
).
Ces différences signifient que les deux systèmes ne sont directement interchangeables que pour les cas simples. Si vous avez besoin d'une correspondance regex des noms de fichiers, vous devez le faire d'une autre manière. find -regex
est une option. (Remarquez qu'il y a aussi find -name
, soit dit en passant, qui utilise la syntaxe glob.)