J'essaie d'utiliser grep pour trouver la chaîne "crk" dans un fichier. Je sais que la chaîne existe dans un fichier source c sous la forme
kop.crk_op = CRK_MOD_EXP;
Cependant, lorsque je recherche en utilisant
grep -rnw --include '*.c' '.' -e "crk"
Je reçois un résultat vide. La ligne
grep -rnw --include '*.c' '.' -e "crk_op"
fonctionne très bien, mais cela ne m’aide vraiment pas. Je suppose que le caractère '_' est en train de gâcher ma recherche. Comment puis-je modifier mon approche pour qu'elle corresponde à toutes les chaînes dont "crk" est une sous-chaîne, même lorsque le caractère "_" est présent, ou à tout autre caractère d'ailleurs?
Edit: Il semble que j'ai un peu gâché la gâchette sur ce post. La commande
grep -rnw --include '*.c' '.' -e "[^ ]*crk[^ ]*"
semble fonctionner. Sinon, quelqu'un peut-il expliquer pourquoi les caractères génériques supplémentaires sont nécessaires?
L'option _-w
_ permet à grep de rechercher des mots et d'afficher crk
lorsqu'il est entouré de caractères autres que Word. De man grep
:
-w, --Word-regexp Sélectionnez uniquement les lignes contenant des correspondances qui forment des mots entiers. Selon le test, la sous-chaîne correspondante doit être soit Au début de la ligne, soit précédée d'un caractère constitutif autre que Word . De même, il doit figurer soit à la fin De la ligne, soit suivi d'un caractère constitutif autre que Word. Les caractères constitutifs du mot sont des lettres, des chiffres, et le trait de soulignement .
__
_ est un caractère Word, donc _crk_op
_ ne correspondra pas crk
à _-w
_.
Le regex convoluted _"[^ ]*crk[^ ]*"
_ fonctionne car il autorise un nombre illimité de caractères autres que des espaces entre les limites de mots requises par grep.
Il suffit de faire:
_grep -rn --include '*.c' . -e crk
_
Vous n'avez pas besoin de qoute _.
_ pour le répertoire actuel.