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 sed
para 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 sed
remover 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 sed
as correspondências de certa greedy
forma, 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 sed
de 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 \x01
como 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 lazy
a correspondência (e muito mais). Como já mencionado porPríncipe João Wesleynos comentários, aqui está opreguiçoso perl
equivalente.
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@/\*[^*]*\*/@@;'