sed - sustituir - Eliminar comentarios de varias líneas
sed linux (6)
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
¿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.
Esto podría funcionar para usted (GNU sed):
sed -r '':a;$!{N;ba};s|//*[^*]*/*+([^/*][^*]*/*+)*/||'' file
¡Es un comienzo, de todos modos!
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
Prueba esto
sed "/^///,///;/d" filename
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
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.