Tengo un archivo de texto que contiene muchas filas de este tipo de cosas:
/*[17:51:27][1 ms]*/ UPDATE `country` SET `region_id` = '4' WHERE `country_id` = '36';
¿Hay alguna manera que pueda utilizar sed
para eliminar los comentarios?solo, entonces, ¿eso es todo lo que comienza con a /*
y termina con a */
? Esto haría que la línea se convirtiera en:
UPDATE `country` SET `region_id` = '4' WHERE `country_id` = '36';
Sé cómo usarlo sed
para eliminar una línea completa que comienza con algo; en el ejemplo de un archivo de texto con SQL, probablemente sería un símbolo hash #
.
Respuesta1
Debido a que sed
coincide de cierta greedy
manera, siempre existe la posibilidad de que el texto posterior al final del comentario coincida en lugar del marcador real de fin de comentario anterior, por ejemplo. como en una cadena entrecomillada que contiene "*/".
Esto no se puede solucionar de sed
forma sencilla, pero se puede solucionar. Este es uno de esos métodos: utilizar un marcador de posición de un solo carácter para el delimitador final de dos caracteres. Usar valores hexadecimales \x01
como caracteres sustitutos es seguro (es decir, no chocará con el texto existente), ya que no existe en el texto normal.
sed "\|^/\*.*\*/|{ s|\*/|\x01|; s|.*\x01|| }" "$file"
perl
, por otro lado, opcionalmente puede manejar lazy
coincidencias (y mucho más). Como ya mencionó porPríncipe Juan Wesleyen los comentarios, aquí está elperezoso perl
equivalente.
perl -ple 's|/\*.*?\*/||g' "$file"
Respuesta2
Prueba este:
sed 's@/\*[^/]*\*/@@'
Desafortunadamente puede tener dificultades con los comentarios /
internos.
Quizás resulten útiles dos variantes juntas: para asegurarse de que se eliminen absolutamente todos los comentarios:
sed 's@/\*[^/]*\*/@@;s@/\*[^*]*\*/@@;'