Je cherche un moyen de grep sur le code source sans avoir parfois de faux positifs à cause des commentaires. Par exemple, si je recherche sur foo sur ce code source .c:
/*
* foo has changed [...] and is now a 2-parameters function
*/
// foo(24)
foo(42, 28);
Un naïf grep
trouvera 3 occurrences où je n'en veux qu'une. J'ai vu cette façon de le faire sur StackOverflow, mais cela ne répond pas à mes besoins: PHP n'est pas disponible sur la plateforme. J'ai également trouvé cette méthode pour les commentaires sur une seule ligne, mais cela ne résout qu'une partie de mon problème.
J'ai besoin d'utiliser des outils de script classiques (awk, sed, bash, grep, etc.) et j'en ai besoin pour être rapide même s'il y a des milliers de fichiers.
Avez-vous maintenant si et comment il est possible de grep sur le code source, et seulement le code source?
Réponses:
Vous pouvez essayer une approche naïve pour faire correspondre les non-commentaires comme celui-ci:
Ce sera seul match inverse contre les commentaires préfixés - qui est des lignes commençant soit
//
,/*
,*
ou*/
- et , par conséquent , il ne vais pas laisser des blocs qui sont en commentaire avec la/*
et*/
paire.la source
grep fonctionne sur du texte pur et ne sait rien de la syntaxe sous-jacente de votre programme C. Par conséquent, afin de ne pas rechercher dans les commentaires, vous avez plusieurs options:
Supprimez les commentaires C avant la recherche, vous pouvez le faire en utilisant
gcc -fpreprocessed -dD -E yourfile.c
Pour plus de détails, veuillez consulter /programming/2394017/remove-comments-from-cc-codeÉcrivez / utilisez des scripts à moitié fonctionnels comme vous l'avez déjà trouvé (par exemple, ils fonctionnent en sautant les lignes commençant par
//
ou/*
) afin de gérer les détails de tous les commentaires C / C ++ possibles (encore une fois, voir le lien précédent pour quelques tests effrayants) . Ensuite, vous pouvez toujours avoir de faux positifs, mais vous n'avez rien à prétraiter.Utilisez des outils plus avancés pour effectuer une "recherche sémantique" dans le code. J'ai trouvé "coccigrep": http://home.regit.org/software/coccigrep/ Ce type d'outils permet de rechercher certaines instructions de langage spécifiques (c'est-à-dire une mise à jour d'une structure avec un prénom) et certainement ils abandonnent les commentaires.
la source
Voici une variation spécifique pour tous les autres d'entre nous les retardataires de cette question:
Une liste des fichiers source C
sont dirigés vers xargs, qui exécute le préprocesseur dans un shell enfant
qui est ensuite canalisé dans une commande grep souhaitée
qui est ensuite canalisé dans sed pour préfixer chaque ligne avec le nom du fichier actuel
Enfin, toutes les lignes blanches répétées sont réduites en lignes simples à l'aide de cat:
Cela fonctionne sur un système RHEL6, mais je suppose qu'il est assez général pour les autres systèmes * nix.
la source