remova apenas ocorrências de texto específicas da string usando sed

remova apenas ocorrências de texto específicas da string usando sed

Eu tenho um arquivo de texto que contém muitas linhas desse tipo:

/*[17:51:27][1 ms]*/ UPDATE `country` SET `region_id` = '4' WHERE `country_id` = '36'; 

Existe uma maneira que eu possa usar sedpara remover os comentáriosapenas, então isso é tudo que começa com a /*e termina com a */? Isso faria com que a linha se tornasse:

UPDATE `country` SET `region_id` = '4' WHERE `country_id` = '36';

Eu sei como sedremover uma linha inteira que começa com alguma coisa, no exemplo de um arquivo de texto com SQL provavelmente seria um símbolo de hash #.

Responder1

Como sedas correspondências de certa greedyforma, há sempre a possibilidade de que o texto após o final do comentário seja correspondido em vez do marcador real de final de comentário anterior, por exemplo. como em uma string entre aspas que contém "*/".
Isso não pode ser resolvido sedde maneira simples, mas você pode contornar isso. Aqui está um método: usar espaço reservado de um caractere para o delimitador final de dois caracteres. Usar o valor hexadecimal \x01como caracteres substitutos é seguro (ou seja, não entrará em conflito com o texto existente), pois não existe no texto normal.

sed "\|^/\*.*\*/|{ s|\*/|\x01|; s|.*\x01|| }" "$file"

perl, por outro lado, pode opcionalmente lidar com lazya correspondência (e muito mais). Como já mencionado porPríncipe João Wesleynos comentários, aqui está opreguiçoso perlequivalente.

perl -ple 's|/\*.*?\*/||g' "$file"

Responder2

Tente este:

sed 's@/\*[^/]*\*/@@'

Infelizmente pode haver dificuldades com comentários /internos.

Pode ser que sejam úteis duas variantes juntas: para ter certeza de que absolutamente todos os comentários serão removidos:

sed 's@/\*[^/]*\*/@@;s@/\*[^*]*\*/@@;'

informação relacionada