web-dev-qa-db-fra.com

Utiliser grep pour rechercher toutes les sous-chaînes de chaînes pouvant contenir des caractères spéciaux

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?

2
Aroto

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.

3
muru