Suppression de tous les commentaires C avec sed

J'essaie d'écrire un script qui va supprimer tous les commentaires et tout ce qui se trouve entre les deux files C dans mon directory actuel. J'ai utilisé sed , et c'est ce que j'ai jusqu'à présent:

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

Cela fonctionne lorsque les commentaires sont sur la même ligne qu'un astérisque ou une barre oblique inverse.

Cependant, cela ne fonctionne pas lorsqu'il y a une ligne commentée sans barre oblique ou astérisque.

Je sais que Sed va ligne par ligne, je ne sais pas comment lui dire de continuer à supprimer jusqu'à ce qu'il voit un */ .

Supprimer des commentaires sans utiliser un véritable préprocesseur C n'est pas tout à fait banal. Une fois, je suis arrivé avec quelque chose comme ça :

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

Ce qui devrait couvrir la plupart des cas comme des choses comme:

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

Voir la discussion intéressante là pour plus de détails.

Si cela ne doit pas être fait dans sed , alors vous pouvez le faire facilement avec perl:

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

Notez que cela supprimera des parties de strings citées qui ne sont pas censées être des commentaires du tout comme dans l'exemple dans les commentaires ci-dessous.