[SED] substitution
Résolu/Fermé
cestrade
-
31 janv. 2008 à 15:26
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 4 févr. 2008 à 10:39
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 4 févr. 2008 à 10:39
A voir également:
- [SED] substitution
- Remplacez le mot sed par le mot mais dans tout le texte. combien de caractères contient le document suite à cette modification (en incluant les espaces) ? - Guide
- Commande sed pour remplacer du texte ✓ - Forum Linux / Unix
- Sed et ses caprices (ou les miens) ✓ - Forum Linux / Unix
- Sed - Remplacement texte par retour à la ligne ? ✓ - Forum Linux / Unix
- Sed supprimer ligne vide - Forum Linux / Unix
9 réponses
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
31 janv. 2008 à 16:03
31 janv. 2008 à 16:03
Salut,
La 1ère expression enlève les commentaires sur une ligne, la 2nd sur plusieurs lignes :
La 1ère expression enlève les commentaires sur une ligne, la 2nd sur plusieurs lignes :
sed -e 's!/\*.*\*/!!' -e '/\/\*/,/\*\//d';-))
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
31 janv. 2008 à 16:40
31 janv. 2008 à 16:40
$ cat plop toto=0; /* ====================== blabla blabla blabla =======================*/ toto=0; /* commentaire blabla blabla blabla sur plusieurs lignes */ toto=1; /* comment */ toto=2; $ sed -e 's!/\*.*\*/!!' -e '/;[ ]*\/\*/{:z; N; s!/\*.*\*/!!;Tz}' -e'/\/\*/,/\*\//d' plop toto=0; toto=0; toto=1; toto=2;;-))
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
1 févr. 2008 à 11:41
1 févr. 2008 à 11:41
Avec ça ça devrait le faire à tous les coups :
;-))
sed -e 's!/\*.*\*/!!' -e '/.*\/\*/{:z; N; s!/\*.*\*/!!;Tz}' -e'/\/\*/,/\*\//d' plopPour les explications, ce soir quand je rentre...
;-))
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
1 févr. 2008 à 16:06
1 févr. 2008 à 16:06
Voilà les explications des différentes parties juste pour la forme, parce qu'avec les nouvelles directives, la simple expression :
En fait on recherche un motif correspondant à "/*bla ... bla... bla ... */" d'abord sur une ligne entière (les délimiteurs commençant et finissant la ligne), puis on examine le cas ou le 1er délimiteur ne serait pas le 1 er caractère sur la ligne et que le délimiteur de fin ne serait pas sur la même ligne. En dernier lieu vient le cas où les commentaires sont sur plusieurs ligne avec un délimiteur de départ en début de ligne...
PS. le motif :
un motif ne commençant pas en début de ligne, après un point virgule suivi éventuellement d'un (ou plusieurs) espace(s)...
;-))
sed -e '/.*\/\*/{:z; N; s!/\*.*\*/!!;Tz}'suffit pour tous les cas ;-))
En fait on recherche un motif correspondant à "/*bla ... bla... bla ... */" d'abord sur une ligne entière (les délimiteurs commençant et finissant la ligne), puis on examine le cas ou le 1er délimiteur ne serait pas le 1 er caractère sur la ligne et que le délimiteur de fin ne serait pas sur la même ligne. En dernier lieu vient le cas où les commentaires sont sur plusieurs ligne avec un délimiteur de départ en début de ligne...
s!/\*.*\*/!! # sur une ligne on supprime tout /.*\/\*/ { # sur plusieurs lignes ( matche aussi le cas sur un seule ligne) mais ne commençant pas en début de ligne. Si une ligne comprenant le motif est trouvée on enchaine les commandes se trouvant entre accolades :z # définition d'une étiquette pour boucler N # donc si un motif est trouvé, on ajoute la ligne suivante dans l'espace de travail s!/\*.*\*/!! # on supprime tout entre /* et */ si le motif est présent T z # on teste si une substitution a eu lieu au cas ou le motif serait présent dans l'espace de travail. Dans le cas contraire on boucle en se branchant à l'étiquette et ainsi de suite jusqu'à ce qu'une substitution ait lieu, ce qui aura pour effet de lancer la commande qui suit l'accolade fermante } /\/\*/,/\*\// d #si un motif correspondant se situe sur plusieurs lignes, on efface toutes les lignes de cet intervalle
PS. le motif :
/;*[ ]*\/\*/correspondait à :
un motif ne commençant pas en début de ligne, après un point virgule suivi éventuellement d'un (ou plusieurs) espace(s)...
;-))
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
une fois de plus, merci jicipy !
la 1° expression, je l'avais, par contre la 2° marche bien sauf ds le cas suivant :
toto=0; /* commentaire
sur plusieurs lignes */
c'est pour ca que je pensais faire la methode ci dessus en supprimant les sauts de lignes, pour avoir tous les commentaires sur une ligne...
une autre idée ?
la 1° expression, je l'avais, par contre la 2° marche bien sauf ds le cas suivant :
toto=0; /* commentaire
sur plusieurs lignes */
c'est pour ca que je pensais faire la methode ci dessus en supprimant les sauts de lignes, pour avoir tous les commentaires sur une ligne...
une autre idée ?
_vince
Messages postés
37
Date d'inscription
mardi 30 janvier 2007
Statut
Membre
Dernière intervention
14 mai 2008
31 janv. 2008 à 16:29
31 janv. 2008 à 16:29
hello,
En utilisant un "code beautyfier" (comme bcpp par exemple), peut etre que tu peux deplacer les commentaires a cheval sur une seule ligne au dessus de la ligne de code.
En utilisant un "code beautyfier" (comme bcpp par exemple), peut etre que tu peux deplacer les commentaires a cheval sur une seule ligne au dessus de la ligne de code.
Merci encore !
J'admet qu'on approche de la perfection, mais j'ai encore trouvé un cas où ca ne marche pas... :
#define ONE 1 /* ceci est un commentaire sur
plusieurs lignes */
C'est vrai je suis vicieux là, mais vu que j'ai du mal à comprendre le "-e '/;[ ]*\/\*/{:z; N; s!/\*.*\*/!!;Tz}'" ...
A+
Christophe
J'admet qu'on approche de la perfection, mais j'ai encore trouvé un cas où ca ne marche pas... :
#define ONE 1 /* ceci est un commentaire sur
plusieurs lignes */
C'est vrai je suis vicieux là, mais vu que j'ai du mal à comprendre le "-e '/;[ ]*\/\*/{:z; N; s!/\*.*\*/!!;Tz}'" ...
A+
Christophe
merci !! Ca m'a l'air de bien marcher !!
pour ceux que ca interesse, le filtre qui supprime donc les commentaires dans un fichier C, qu'ils soient de type /* comment */ , // comment , sur une ou plusieurs lignes .... :
sed -e 's!/\*.*\*/!!
/.*\/\*/{:z; N; s!/\*.*\*/!!;Tz}
s/\/\/.*//g
/\/\*/,/\*\//d
'
pour ceux que ca interesse, le filtre qui supprime donc les commentaires dans un fichier C, qu'ils soient de type /* comment */ , // comment , sur une ou plusieurs lignes .... :
sed -e 's!/\*.*\*/!!
/.*\/\*/{:z; N; s!/\*.*\*/!!;Tz}
s/\/\/.*//g
/\/\*/,/\*\//d
'
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
1 févr. 2008 à 18:50
1 févr. 2008 à 18:50
Allez un ch'tit dernier pour la route et pour que ce soit bien propre (le dernier laisser plein de lignes vides inutiles).
Le fichier de départ :
Le fichier de départ :
$ cat plop toto=0; /* ====================== blabla blabla blabla =======================*/ toto=1; /* commentaire blabla blabla blabla sur plusieurs lignes */ #define ONE 1 /* ceci est un commentaire sur plusieurs lignes */ toto=2; /* comment */ toto=3;La version sale :
$ sed -e '/.*\/\*/{:z; N; s!/\*.*\*/!!;Tz}' plop toto=0; toto=1; #define ONE 1 toto=2; toto=3;Et la version proprette :
$ sed -e '/.*\/\*/{:z; N; s!/\*.*\*/!!;Tz; /^$/{N;/^\n$/d}}' plop toto=0; toto=1; #define ONE 1 toto=2; toto=3;;-))
Merci pour ces explications limpides ! ;-)
ca marche du tonnerre de Brest !
A+
ca marche du tonnerre de Brest !
A+
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
4 févr. 2008 à 10:39
4 févr. 2008 à 10:39
Et pourtant je ne suis pas breton, conG* ! ;-))
* Avé l'assent !
* Avé l'assent !