Busco una forma de grep en el código fuente sin tener a veces falsos positivos debido a los comentarios. Por ejemplo, si busco en foo en este código fuente .c:
/*
* foo has changed [...] and is now a 2-parameters function
*/
// foo(24)
foo(42, 28);
Un ingenuo grep
encontrará 3 casos en los que solo quiero uno. He visto esta forma de hacerlo en StackOverflow, pero no satisface mis necesidades: PHP no está disponible en la plataforma. También he encontrado esta manera para comentarios de una línea, pero solo resuelve una parte de mi problema.
Necesito usar herramientas de secuencias de comandos clásicas (awk, sed, bash, grep, etc.) y necesito que sea rápido incluso si hay miles de archivos.
¿Ahora si y cómo es posible grep en el código fuente, y solo el código fuente?
Respuestas:
Puede intentar un enfoque ingenuo para que coincida con no comentarios como este:
Esto sólo coincidirá con el prefijo inverso sobre comentarios - que es las líneas que comienzan con cualquiera
//
,/*
,*
o*/
- y por lo tanto no va a dejar de lado los bloques que se comentan a cabo con el/*
y*/
par.fuente
grep funciona en texto puro y no sabe nada sobre la sintaxis subyacente de su programa en C. Por lo tanto, para no buscar dentro de los comentarios tiene varias opciones:
Elimine los comentarios C antes de la búsqueda, puede hacerlo usando
gcc -fpreprocessed -dD -E yourfile.c
Para obtener más información, consulte /programming/2394017/remove-comments-from-cc-codeEscriba / use algunos scripts hacky de medio trabajo como ya ha encontrado (por ejemplo, funcionan saltando líneas que comienzan con
//
o/*
) para manejar los detalles de todos los posibles comentarios de C / C ++ (nuevamente, vea el enlace anterior para algunos casos de prueba de miedo) . Entonces aún puede tener falsos positivos, pero no tiene que preprocesar nada.Use herramientas más avanzadas para hacer "búsqueda semántica" en el código. He encontrado "coccigrep": http://home.regit.org/software/coccigrep/ Este tipo de herramientas permite buscar algunas declaraciones de lenguaje específicas (es decir, una actualización de una estructura con un nombre de pila) y ciertamente dejan caer los comentarios.
fuente
Aquí hay una variación específica para todos los que llegamos tarde a esta pregunta:
Una lista si los archivos fuente C
se canalizan a xargs, que ejecuta el preprocesador en un shell secundario
que posteriormente se canaliza a un comando grep deseado
que luego se canaliza a sed para prefijar cada línea con el nombre del archivo actual
Finalmente, todas las líneas en blanco repetidas se contraen en líneas simples usando cat:
Esto funciona en un sistema RHEL6, pero supongo que es lo suficientemente general para otros sistemas * nix.
fuente