2012-05-11 5 views
0

Je cherche à supprimer les commentaires C de nos fichiers de correctifs et j'ai regardé de nombreuses expressions régulières, mais si nous enlevons des lignes de nos correctifs - cela les casserait.Méthode pour supprimer les commentaires C des fichiers de correctifs

Comment écrivez-vous une commande regex ou sed pour rechercher des commentaires dans les fichiers de correctifs de différences et remplacer les lignes de commentaires par des espaces vides.

Cela fonctionne sed œuvres regex pour les fichiers C, mais pour les patches j'ai besoin quelque chose de différent:

sed '/^\/\*/,/\*\//d' 

Un exemple correctif Exerpt serait:

@@ -382,7 +391,109 @@ 
     return len; 
} 

+/********************************************************************************** 
+ * Some patch 
+ * Author: Mcdoomington 
+ * Do somethimg 
+ * 
+ * fix me 
+ **********************************************************************************/ 

Quelqu'un a des idées?

Edit:

En utilisant ce filtre:

sed -e 's,^+ \*.*,+ \/\/Comment removed,' mypatch.patch > output 


+/********************************************************************************** 
+ //Comment removed 
+ //Comment removed 
+ //Comment removed 

Comment puis-je ajouter une si ligne se termine par \ pour sauter?

Edit: Solution

Sans la façon la plus propre - j'utilisé sed avec un regex truqué jury.

sed -e '/[^\*\/]$/{N;s,^+ \* .*,+ \* Comment removed,;}' patch > output 
sed -e '/[^\*\/]$/{N;s,^+\\\* .*,+ \/\* Comment removed,;}' patch > output 

Notez la seconde commande peut être un peu trop gourmand, mais aux fins de commentaires désinfectante - cela fonctionne!

Comment ça marche:

1.) Première commande Pour déterminer si cela est la fin d'un commentaire/[^ * /] $/détermine si elle est /puis {N; s, +^\ *., +/* Le commentaire a été supprimé ,;} 'trouve + * (peu importe) et le remplace par * Le commentaire a été supprimé.

2.) Deuxième commande Pour déterminer si cela est la fin d'un commentaire/[^ * /] $/détermine si elle est /puis {N; s,^+ \ *., +/* Le commentaire a été supprimé ,;} 'trouve + * (peu importe) et le remplace par * Le commentaire a été supprimé.

+0

Les fichiers de correctifs sont-ils entrants ou les générez-vous? Est-ce que tous les commentaires que vous voulez déplacer, ou simplement bloquer les commentaires entre les fonctions? –

+0

Les fichiers de correctifs ont déjà été créés et je cherchais un moyen facile de supprimer les commentaires ou au moins de les effacer. Créer de nouveaux correctifs est une tâche énorme en raison de l'environnement de transfert et ils sont environ 30+. – mcdoomington

+1

Il y a un point où les expressions rationnelles ne sont tout simplement pas assez intelligentes ou flexibles pour faire ce que vous voulez; C'est l'un de ces cas. Vous devez être capable de reconnaître les jetons '/ *', '* /', et '//' et d'analyser le fichier en conséquence. Personnellement, je ferais mon propre filtre à la main pour un travail comme celui-ci; ne devrait pas prendre plus de quelques heures. –

Répondre

1

Je viens d'utiliser un hackjob rapide et sale qui conserve la plupart des commentaires à l'aide

sed -e '/[^\*\/]$/{N;s,^+ \* .*,+ \* Comment removed,;}' patch > output 
sed -e '/[^\*\/]$/{N;s,^+\\\* .*,+ \/\* Comment removed,;}' patch > output 
1

Les expressions régulières sont merveilleuses, mais pas si merveilleuses. Je voudrais supprimer les commentaires avant de créer le correctif.

Si vous ne pouvez pas faire cela, je voudrais appliquer le patch. Supprimez les commentaires des fichiers corrigés et non patchés, puis recréez le correctif.

donc en commençant par x.h nous le modifier pour x1.h et créer un patch:

diff -u x.h x1.h > patch 

Ensuite, nous publions le patch à quelqu'un qui a x.h.

cp x.h xnc.h 
sed -e '/^\/\*/,/\*\//d' -i xnc.h 
patch x.h patch 
cp x.h xnc2.h 
sed -e '/^\/\*/,/\*\//d' -i xnc2.h 
diff -u xnc.h xnc2.h > patchnc 

doit créer le correctif sans commentaire.

Mais si je l'ai patché et des arbres sources non patchées, puis

find unpatched -exec sed -e ':^/\*:,:\*/:d' -i "{}" \; 
find patched -exec sed -e ':^/\*:,:\*/:d' -i "{}" \; 
diff -urN unpatched patched > patch 
+0

Malheureusement, il s'agit d'un processus qui prend du temps, savez-vous d'une façon qui pourrait au moins automatiser une bonne partie de ce processus? – mcdoomington

+0

vous devriez être en mesure de le script. Pourquoi ne pas le faire avant de faire le patch? – Julian

+1

@mcdoomington: Voulez-vous supprimer tous les commentaires, ou seulement ceux qui apparaissent dans le patch? Que voulez-vous faire à propos d'un patch qui n'affecte qu'une partie d'un commentaire de bloc? Il y a des programmes de strip-teaseurs de commentaires en C (j'ai un couple que j'ai écrit, je ne serai pas le seul à en avoir) et je serais enclin à réviser le processus de génération de patch pour que l'ancienne et la nouvelle les commentaires indésirables avant que les correctifs ne soient créés. –

0

Je ne voudrais pas utiliser des expressions régulières. En général, ils travaillent dans une ligne. Et votre fichier contiendra des commentaires qui s'exécutent sur plusieurs lignes. Je voudrais écrire un analyseur simple en C/C++ ou Java.

Démarrer avec l'état 0.

Dans l'état 0 juste de lire le caractère par caractère (et la sortie il) jusqu'à ce que vous trouver une séquence de/*

passer ensuite à l'état 1.

Dans l'état 1 juste de lire caractère par caractère (et ne le sortir) jusqu'à ce que vous trouviez une séquence de */

Questions connexes