J'ai trouvé echo file|grep fil*
échoue, mais echo abcd|grep abc*
réussit.
Je ne comprends pas, quelqu'un peut-il expliquer?
J'ai trouvé echo file|grep fil*
échoue, mais echo abcd|grep abc*
réussit.
Je ne comprends pas, quelqu'un peut-il expliquer?
Réponses:
Il y a deux problèmes avec votre exemple.
Le principal est que vous supposez que les expressions régulières fonctionnent de la même manière que les modèles globaux dans la mesure où il *
s'agit d'un caractère générique signifiant "n'importe quelle séquence de caractères". Dans les expressions régulières, *
signifie "n'importe quel nombre de l'atome précédent" à la place, donc fil*
signifie f
suivi par i
suivi de zéro ou plusieurs l
caractères. Vous devez dire grep fil.*
pour obtenir la signification voulue: .
signifie "n'importe quel caractère unique, ce qui .*
signifie" n'importe quelle séquence de caractères ".
Le moindre problème est que vous utilisez des caractères spéciaux non cités qui signifient quelque chose selon les règles glob, ce qui signifie que le shell pourrait les interpréter. Si vous aviez des fichiers dans le répertoire local correspondant aux modèles glob fil*
ou abc*
, le shell les développait , donc grep
les noms de fichiers développés comme un modèle, et non le RE souhaité. Chaque fois que vous êtes en utilisant ces caractères sur la ligne de commande, vous devez les citer: echo file | grep 'fil.*'
.
echo file|grep fil*
répond avecfil
e.