Estou tentando converter comentários no estilo 'C' de linha única para o estilo 'C ++'. O 'sed' abaixo não é ruim, mas é claro que ele falha se qualquer código principal (código antes do comentário) tiver algum '/' nele:
sed -i 's,\(^[^\/]*\)\/\*\([^\*]*\)\*\/[ ]*$,\/\/,' filename
O que eu gostaria de poder fazer é isto:
... [^\/\*] ...
i.e. negate '/ *' que não funciona, claro, mas depois de várias horas de pesquisa, não consigo encontrar uma explicação simple de como fazer isso corretamente :( Não parece deve ser ciência de foguetes.
Por exemplo, estas sequências:
blah blah /* comment */
blah blah / blah /* comment */
blah blah /* comment */ blah
blah blah / blah /* comment */ blah
... deve converter-se assim:
blah blah // comment
blah blah / blah // comment
blah blah /* comment */ blah (this CAN'T be converted)
blah blah / blah /* comment */ blah (this CAN'T be converted)
... obviamente nenhuma conversão pode ocorrer se houver código APÓS o comentário 'C'.
Eu farei uma comparação visual próxima entre o arquivo, antes e depois, então não há necessidade de manipular '/ *' dentro de um literal, nem quero converter qualquer coisa em multi-linha.
Note que eu penso nisso como um problema de 'negação', mas talvez haja outra maneira. Eu só preciso capturar tudo antes de um '/ *' e não me importa como.
ACOMPANHE A RESPOSTA ABAIXO
Bem, droga! Eu vejo que eu entendi completamente algo fundamental:
.*/\*
... lê: "qualquer coisa exceto slash star seguido por slash star", então na verdade eu recebo minha 'negação' de graça :-)
Então, indo ainda mais longe do que Barmar:
sed -i 's,^\(.*\)/\*\(.*\)\*/\s*$,//,' filename
... vai perceber isso:
blah / * blah /* co / mme * nt */
e imprima isto:
blah / * blah // co / mme * nt
Iluminismo.