Excluindo todos os comentários C com sed [duplicado]

10

Eu estou tentando escrever um script que irá apagar todos os comentários e tudo entre os arquivos C no meu diretório atual. Eu tenho usado sed , e é isso que eu tenho até agora:

sed -i '/ * [^()] */d' *.c

Isso funciona quando os comentários estão na mesma linha que um asterisco ou uma barra invertida.

No entanto, não funciona quando há uma linha comentada sem uma barra ou asterisco.

Eu sei que o sed vai linha por linha, só não sei como dizer para continuar excluindo até ver um */ .

    
por Dawn 14.04.2013 / 23:30

2 respostas

9

Remover comentários sem usar um pré-processador C real não é exatamente trivial. Uma vez eu cheguei a algo parecido com isso :

perl -0777 -pe'
 s{
     /\*.*?\*/
   | //[^\n]*
   | (
        "(?:\.|.)*?"
      | '\''(?:\.)?.*?'\''
      | \?\?'\''
      | .[^'\''"/]*
     )
  }{if ($1eq""){" "}else{$1}}exsg' 

O que deve cobrir a maioria dos casos, como coisas como:

printf("%c%c%s", '"' /* d-quote */, '\'', "/*" "*/");

Veja a discussão interessante para mais detalhes.

    
por 15.04.2013 / 17:17
4

Se isso não precisar ser feito em sed , você pode fazer isso facilmente com perl:

perl -p0i -e 's#/\*.*?\*/##sg' *.c

Observe que isso excluirá partes de strings entre aspas que não devem ser comentários, como no exemplo nos comentários abaixo.

    
por 14.04.2013 / 23:49