remove somente ocorrências de texto específicas da string usando sed

3

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

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

Existe uma maneira de usar sed para remover os comentários somente , e isso é tudo que começa com /* e termina com */ ? Isso tornaria a linha:

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

Eu sei como usar sed para remover uma linha inteira que começa com algo, no exemplo de um arquivo de texto com SQL nela, provavelmente seria um símbolo de hash # .

    
por crmpicco 28.06.2012 / 18:21

2 respostas

4

Como sed corresponde em greedy , sempre existe 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 tratado por sed de maneira simples, mas você pode contornar isso. Aqui está um desses métodos: usando um marcador de espaço de caractere único para o delimitador final de dois caracteres. Usando o valor hexadecimal \x01 , pois os caracteres iniciais são seguros (isto é, não colidirão com o texto existente), pois não existem no texto normal.

sed "\|^/\*.*\*/|{ s|\*/|\x01|; s|.*\x01|| }" "$file"
Por outro lado,

perl pode manipular lazy correspondência (e muito mais). Como já mencionado por Prince John Wesley nos comentários, aqui está o preguiçoso perl equivalente.

perl -ple 's|/\*.*?\*/||g' "$file"
    
por 28.06.2012 / 22:20
2

Tente este:

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

Infelizmente, pode ter dificuldades com comentários com / dentro.

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

sed 's@/\*[^/]*\*/@@;s@/\*[^*]*\*/@@;'
    
por 28.06.2012 / 18:35