Comment grep sur le code source sans attraper les commentaires

10

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 greptrouvera 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?

Coren
la source
3
La création d'une table de balises peut être une meilleure approche, selon ce que vous faites.
Gilles 'SO- arrête d'être méchant'

Réponses:

10

Vous pouvez essayer une approche naïve pour faire correspondre les non-commentaires comme celui-ci:

 $ egrep -v "^(//|/\*| \*)" sourcecode

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
Modifié légèrement pour fonctionner pour les commentaires en retrait: $ egrep -v "^ [[: space:]] * ((// | / * | *)" code source
mbonness
11

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:

  1. Supprimez les commentaires C avant la recherche, vous pouvez le faire en utilisant gcc -fpreprocessed -dD -E yourfile.cPour plus de détails, veuillez consulter /programming/2394017/remove-comments-from-cc-code

  2. É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.

  3. 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.

dying_sphynx
la source
1

Voici une variation spécifique pour tous les autres d'entre nous les retardataires de cette question:

ls -1 src/*.c | xargs -i sh -c "echo;gcc -fpreprocessed -dD -E {} 2>&1 | grep -wi -e one -e two -e three -n | sed 's:^:{}\::'" | cat -s

Une liste des fichiers source C

ls -1 src/*.c

sont dirigés vers xargs, qui exécute le préprocesseur dans un shell enfant

gcc -fpreprocessed -dD -E {} 2>&1

qui est ensuite canalisé dans une commande grep souhaitée

grep -wi -e one -e two -e three -n

qui est ensuite canalisé dans sed pour préfixer chaque ligne avec le nom du fichier actuel

sed 's:^:{}\::'

Enfin, toutes les lignes blanches répétées sont réduites en lignes simples à l'aide de cat:

cat -s

Cela fonctionne sur un système RHEL6, mais je suppose qu'il est assez général pour les autres systèmes * nix.

David A. Pimentel
la source