Eliminar comentarios de varias líneas

¿Cómo elimino todos los comentarios si comienzan con / * y terminan con * / He intentado lo siguiente. Funciona para un comentario de línea.

sed '/\/\*/d' 

Pero no elimina los comentarios de líneas múltiples. por ejemplo, las líneas segunda y tercera no se eliminan.

 /*!50500 PARTITION BY RANGE (TO_SECONDS(date_time )) PARTITION 20120102parti VALUES LESS THAN (63492681600), (PARTITION 20120101parti VALUES LESS THAN (63492595200) */ ; 

En el ejemplo anterior, necesito retener el último; después del signo de comentario de cierre.

Si esto está en un archivo C, DEBE usar un preprocesador C para esto en combinación con otras herramientas para deshabilitar temporalmente la funcionalidad del preprocesador específico, como expandir #defines o #includes, todos los otros enfoques fallarán en casos extremos. Esto funcionará para todos los casos:

 [ $# -eq 2 ] && arg="$1" || arg="" eval file="\$$#" sed 's/a/aA/g;s/__/aB/g;s/#/aC/g' "$file" | gcc -P -E $arg - | sed 's/aC/#/g;s/aB/__/g;s/aA/a/g' 

Colóquelo en un script de shell y llámelo con el nombre del archivo que desea analizar, opcionalmente con el prefijo de un indicador como “-ansi” para especificar el estándar de C para aplicar.

Aquí hay una forma de usar GNU sed . Ejecutar como sed -rf script.sed file.txt

Contenido de script.sed :

 :a s%(.*)/\*.*\*/%\1% ta /\/\*/ !b N ba 

Alternativamente, aquí está el único trazador de líneas:

 sed -r ':a; s%(.*)/\*.*\*/%\1%; ta; /\/\*/ !b; N; ba' file.txt 

Esto debería hacer

  sed 's|/\*|\n&|g;s|*/|&\n|g' a.txt | sed '/\/\*/,/*\//d' 

Para prueba:

a.txt

 /* Line test multi comment */ Hello there this would stay /* this would be deleteed */ 

Mando:

 $ sed 's|/\*|\n&|g;s|*/|&\n|g' a.txt | sed '/\/\*/,/*\//d' Hello there this would stay 

Para complementar la respuesta de Ed (centrada en los archivos C), sugeriría el excelente script de sed remccoms3.sed por Brian Hiles para archivos que no sean C (por ejemplo, archivo PL / SQL). Maneja los comentarios C y C ++ (//) y omite correctamente los comentarios dentro de las cadenas. El script está disponible aquí: http://sed.sourceforge.net/grabbag/scripts/remccoms3.sed

Esto podría funcionar para usted (GNU sed):

 sed -r ':a;$!{N;ba};s|/\*[^*]*\*+([^/*][^*]*\*+)*/||' file 

¡Es un comienzo, de todos modos!

Prueba esto

 sed "/^\//,/\/;/d" filename