Pourquoi "grep fil *" échoue-t-il?

J'ai trouvé echo file|grep fil* échoue, mais echo abcd|grep abc* réussit.

Je ne comprends pas, quelqu'un peut-il expliquer?

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 façon que les patterns glob dans * est un caractère générique qui signifie «n'importe quelle séquence de caractères». Dans les expressions régulières, * signifie "tout numéro de l'atome précédent" à la place, donc fil* signifie f suivi de i suivi de zéro ou plus de l caractères. Vous devez dire grep fil.* Pour get la signification voulue:. signifie "un seul caractère, de sorte que .* signifie" toute séquence de caractères ".

Le moindre problème est que vous utilisez des caractères spéciaux sans guillemets qui signifient quelque chose sous les règles glob, ce qui signifie que le shell peut les interpréter. Si vous aviez des files dans le directory local correspondant aux files glob fil* ou abc* , le shell les étendrait , donc grep obtiendrait les noms de files développés comme un model, pas le RE intentionnel. Chaque fois que vous utilisez de tels caractères sur la command line, vous devez les citer: echo file | grep 'fil.*' echo file | grep 'fil.*' .