(9 respuestas)
Cerrado hace 4 años.
Estoy tratando de escribir una secuencia de comandos que elimine todos los comentarios y todo lo demás dentro de los archivos C en mi directorio actual. He estado usando sed
, y esto es lo que tengo hasta ahora:
sed -i '/ * [^()] */d' *.c
Esto funciona cuando los comentarios están en la misma línea que un asterisco o una barra invertida.
Sin embargo, no funciona cuando hay una línea comentada sin barra o asterisco.
Sé que sed va línea por línea, pero no sé cómo decirle que siga eliminando hasta que vea un */
.
Respuesta aceptada:
Eliminar comentarios sin usar un preprocesador C real no es exactamente trivial. Una vez se me ocurrió algo como esto:
perl -0777 -pe'
s{
/*.*?*/
| //[^n]*
| (
"(?:\.|.)*?"
| '''(?:\.)?.*?'''
| ??'''
| .[^'''"/]*
)
}{if ($1eq""){" "}else{$1}}exsg'
Que debería cubrir la mayoría de los casos como cosas como:
printf("%c%c%s", '"' /* d-quote */, ''', "/*" "*/");
Consulte la interesante discusión allí para obtener más detalles.