Ich suche nach einer Möglichkeit, nach Quellcode zu suchen, ohne aufgrund von Kommentaren manchmal falsch positiv zu sein. Zum Beispiel, wenn ich auf foo nach diesem .c-Quellcode suche:
/*
* foo has changed [...] and is now a 2-parameters function
*/
// foo(24)
foo(42, 28);
Ein Naiver grep
wird 3 Vorkommen finden, bei denen ich nur eines möchte. Ich habe dies auf StackOverflow gesehen, aber es erfüllt nicht meine Anforderungen: PHP ist auf der Plattform nicht verfügbar. Ich habe diesen Weg auch für einzeilige Kommentare gefunden, aber er löst nur einen Teil meines Problems.
Ich muss klassische Skript-Tools (awk, sed, bash, grep usw.) verwenden und es muss schnell sein, selbst wenn es Tausende von Dateien gibt.
Wissen Sie jetzt, ob und wie es möglich ist, den Quellcode und nur den Quellcode zu erfassen?
Antworten:
Sie können einen naiven Ansatz ausprobieren, um Nicht-Kommentare wie diesen abzugleichen:
Dies wird nur inverse Spiel gegen Präfix Kommentare - die Zeilen beginnend mit entweder
//
,/*
,*
oder*/
- und daher wird es nicht blockiert auslassen , die mit dem sind auf Kommentar/*
und*/
Paar.quelle
grep arbeitet mit reinem Text und weiß nichts über die zugrunde liegende Syntax Ihres C-Programms. Um nicht in Kommentaren zu suchen, haben Sie mehrere Möglichkeiten:
Entfernen Sie C-Kommentare vor der Suche.
gcc -fpreprocessed -dD -E yourfile.c
Weitere Informationen finden Sie unter /programming/2394017/remove-comments-from-cc-codeSchreiben / verwenden Sie einige hackige, halbwegs funktionierende Skripte, wie Sie sie bereits gefunden haben (z. B. überspringen Sie Zeilen, die mit
//
oder beginnen/*
), um die Details aller möglichen C / C ++ - Kommentare zu verarbeiten (siehe auch den vorherigen Link für einige beängstigende Testfälle). . Dann haben Sie möglicherweise immer noch falsch positive Ergebnisse, müssen jedoch nichts vorverarbeiten.Verwenden Sie erweiterte Tools für die "semantische Suche" im Code. Ich habe "coccigrep" gefunden: http://home.regit.org/software/coccigrep/ Diese Art von Tools ermöglicht die Suche nach bestimmten Sprachanweisungen (dh eine Aktualisierung einer Struktur mit Vorname) und lässt die Kommentare sicher fallen.
quelle
Hier ist eine spezielle Variante für alle anderen, die zu spät zu dieser Frage kommen:
Eine Liste der C-Quelldateien
werden an xargs weitergeleitet, das den Präprozessor in einer untergeordneten Shell ausführt
welches anschließend in einen gewünschten grep-Befehl geleitet wird
Diese wird dann in sed weitergeleitet, um jeder Zeile den aktuellen Dateinamen voranzustellen
Schließlich werden alle wiederholten Leerzeilen mit cat: zu einzelnen Zeilen zusammengefasst:
Dies funktioniert auf einem RHEL6-System, aber ich gehe davon aus, dass es allgemein genug für andere * nix-Systeme ist.
quelle