Poszukuję sposobu na grep w kodzie źródłowym bez czasami fałszywie dodatnich z powodu komentarzy. Na przykład, jeśli szukam foo na tym kodzie źródłowym .c:
/*
* foo has changed [...] and is now a 2-parameters function
*/
// foo(24)
foo(42, 28);
Naiwny grep
znajdzie 3 przypadki, w których chcę tylko jedno. Widziałem ten sposób na StackOverflow, ale nie spełnia moich potrzeb: PHP nie jest dostępne na platformie. Znalazłem również tę drogę dla komentarzy w jednym wierszu, ale to rozwiązuje tylko część mojego problemu.
Muszę używać klasycznych narzędzi skryptowych (awk, sed, bash, grep itp.) I muszę być szybki, nawet jeśli istnieją tysiące plików.
Czy wiesz, czy i jak można grepować na kod źródłowy i tylko kod źródłowy?
Odpowiedzi:
Możesz wypróbować naiwne podejście, aby dopasować nie-komentarze w następujący sposób:
Będzie to tylko odwrotny meczu z prefiksem komentarze - czyli linie zaczynające się też
//
,/*
,*
lub*/
- a więc nie zostawimy na bloki, które są komentarzem z/*
i*/
pary.źródło
grep działa na czystym tekście i nie wie nic o podstawowej składni twojego programu C. Dlatego, aby nie przeszukiwać komentarzy, masz kilka opcji:
Usuń C-komentarze przed wyszukiwaniem, możesz to zrobić za pomocą
gcc -fpreprocessed -dD -E yourfile.c
Aby uzyskać szczegółowe informacje, zobacz /programming/2394017/remove-comments-from-cc-codeNapisz / użyj skryptu na wpół działającego skryptu, takiego jak już znalazłeś (np. Działają one pomijając linie zaczynające się od
//
lub/*
), aby obsłużyć szczegóły wszystkich możliwych komentarzy C / C ++ (ponownie, patrz poprzednie łącze dla niektórych przerażających przypadków testowych) . Wtedy nadal możesz mieć fałszywie pozytywne wyniki, ale nie musisz niczego przetwarzać.Użyj bardziej zaawansowanych narzędzi do wykonywania „wyszukiwania semantycznego” w kodzie. Znalazłem „coccigrep”: http://home.regit.org/software/coccigrep/ Tego rodzaju narzędzia pozwalają na wyszukiwanie określonych instrukcji językowych (tj. Aktualizację struktury o podanej nazwie) i na pewno usuwają komentarze.
źródło
Oto konkretna odmiana dla nas wszystkich spóźniających się na to pytanie:
Lista, jeśli pliki źródłowe w C.
są przesyłane strumieniowo do xargs, który wykonuje preprocesor w powłoce potomnej
który jest następnie przesyłany do żądanego polecenia grep
który jest następnie przesyłany do sed w celu poprzedzenia każdego wiersza bieżącą nazwą pliku
Na koniec wszystkie powtarzające się puste linie są zwijane do pojedynczych linii za pomocą cat:
Działa to na systemie RHEL6, ale zakładam, że jest wystarczający dla innych systemów * nix.
źródło