eliminar solo apariciones de texto específicas de la cadena usando sed

eliminar solo apariciones de texto específicas de la cadena usando sed

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 sedpara 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 sedpara 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 sedcoincide de cierta greedymanera, 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 sedforma 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 \x01como 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 lazycoincidencias (y mucho más). Como ya mencionó porPríncipe Juan Wesleyen los comentarios, aquí está elperezoso perlequivalente.

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@/\*[^*]*\*/@@;'

información relacionada