Substitution avec sed
romzzzz
-
romzzzz -
romzzzz -
Bonjour,
dans un fichier source c, je dois récupérer un bloc de texte bien particulier (qui est en fait un prototype de fonction). Ce bloc de texte est délimité à droite par un point virgule et à gauche par un point virgule ou un { ou les deux caractères */ (étoile slash). Enfin il comprend à l'intérieur le nombre x.
sed peut faire la substitution mais ce qui me gène c'est la prise en compte du "ou" pour les caractères limitant à gauche et surtout le fait de préciser que le nombre x doit être inclus dans ce bloc.
Merci !
dans un fichier source c, je dois récupérer un bloc de texte bien particulier (qui est en fait un prototype de fonction). Ce bloc de texte est délimité à droite par un point virgule et à gauche par un point virgule ou un { ou les deux caractères */ (étoile slash). Enfin il comprend à l'intérieur le nombre x.
sed peut faire la substitution mais ce qui me gène c'est la prise en compte du "ou" pour les caractères limitant à gauche et surtout le fait de préciser que le nombre x doit être inclus dans ce bloc.
Merci !
A voir également:
- Substitution avec sed
- 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
- Comptage des caractères dans Word ✓ - Forum Word
- La tentative de récursion de substitution d'image s'annule - Forum Logiciels
- Sed et ses caprices (ou les miens) ✓ - Forum Linux / Unix
- Sed crlf - Astuces et Solutions
11 réponses
Voilà par exemple un extrait du fichier c :
.....
.....
.....
***************************************************************/
admn_ano_ ( (message_struct_def *)msg_sco_p,
(context_struct_def *)ctx_glob_p, (u16)1250,
(s16)nouvel_etat );
....
....
****************/
admn_em_ano ( (id_classe_t)VAL_IRT_FCT_PADMN,
ANO_NON_SIGNIFICATIVE,
(u32) 0, (u16)1990,
(u16) 0,
(u8*) NULL,
(u16) 0,
(u8*) NULL,
(u16) 0,
(u8*) NULL );
.....
.....
Je dois récupérer les prototypes des deux fonctions (ie du nom jusqu'à la dernière parenthèse fermante).
Ici les fonctions sont délimitées à droite par un */ (mais cela peut être un { ou un point virgule) et elles contiennent le nombre 1250 pour l'une et 1990 pour l'autre.
Ce sont en effet les seuls points communs que possèdent toutes ces fonctions.
J'espère que c'est plus clair ?
.....
.....
.....
***************************************************************/
admn_ano_ ( (message_struct_def *)msg_sco_p,
(context_struct_def *)ctx_glob_p, (u16)1250,
(s16)nouvel_etat );
....
....
****************/
admn_em_ano ( (id_classe_t)VAL_IRT_FCT_PADMN,
ANO_NON_SIGNIFICATIVE,
(u32) 0, (u16)1990,
(u16) 0,
(u8*) NULL,
(u16) 0,
(u8*) NULL,
(u16) 0,
(u8*) NULL );
.....
.....
Je dois récupérer les prototypes des deux fonctions (ie du nom jusqu'à la dernière parenthèse fermante).
Ici les fonctions sont délimitées à droite par un */ (mais cela peut être un { ou un point virgule) et elles contiennent le nombre 1250 pour l'une et 1990 pour l'autre.
Ce sont en effet les seuls points communs que possèdent toutes ces fonctions.
J'espère que c'est plus clair ?
Oui et non ;-\
Mets un peu plus de code avec ce que tu veux récupérer en gras et avec des exemples contenants toutes les possibilités du OU "), */, {, ;".
Merci
Mets un peu plus de code avec ce que tu veux récupérer en gras et avec des exemples contenants toutes les possibilités du OU "), */, {, ;".
Merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
.....
.....
.....
***************************************************************/
admn_ano_ ( (message_struct_def *)msg_sco_p,
(context_struct_def *)ctx_glob_p, (u16)1250,
(s16)nouvel_etat );
....
....
****************/
admn_em_ano ( (id_classe_t)VAL_IRT_FCT_PADMN,
ANO_NON_SIGNIFICATIVE,
(u32) 0, (u16)1990,
(u16) 0,
(u8*) NULL,
(u16) 0,
(u8*) NULL,
(u16) 0,
(u8*) NULL );
.....
.....
{
admn_an2_ine (
(context_struct_def *)ctx_glob_p, (u16)1786,
(s16)nouvel_etat);
....
.....
......;
admn_em_anolog ( (id_classe_t) VAL_IRT_FCT_PADMN,
(u32) 0, (u16)235,
(u16) admn_lg_msg);
?
.....
.....
***************************************************************/
admn_ano_ ( (message_struct_def *)msg_sco_p,
(context_struct_def *)ctx_glob_p, (u16)1250,
(s16)nouvel_etat );
....
....
****************/
admn_em_ano ( (id_classe_t)VAL_IRT_FCT_PADMN,
ANO_NON_SIGNIFICATIVE,
(u32) 0, (u16)1990,
(u16) 0,
(u8*) NULL,
(u16) 0,
(u8*) NULL,
(u16) 0,
(u8*) NULL );
.....
.....
{
admn_an2_ine (
(context_struct_def *)ctx_glob_p, (u16)1786,
(s16)nouvel_etat);
....
.....
......;
admn_em_anolog ( (id_classe_t) VAL_IRT_FCT_PADMN,
(u32) 0, (u16)235,
(u16) admn_lg_msg);
?
Le nom des fonctions, le nombre d'arguments et le type des arguments ne sont jamais les même, mais il y a toujours un nombre à l'intérieur. Elles peuvent être sur une ou plusieurs lignes.
Et un peu du reste du code, ce n'est pas possible ?
Toutes les fonctions à récupérer commencent par "admn_" ?
Ou non ?
Il y a d'autres fonctions qui commencent par ça et qu'il ne faut pas récupérer ?
Désolé d'être aussi tétu, mais bien souvent on se casse la tête pour satisfaire la demande et ensuite on vient nous dire, mais si il y a ça, ou ça, mais je ne veux pas ça, ça ne marche pas parce que...
;-\
Toutes les fonctions à récupérer commencent par "admn_" ?
Ou non ?
Il y a d'autres fonctions qui commencent par ça et qu'il ne faut pas récupérer ?
Désolé d'être aussi tétu, mais bien souvent on se casse la tête pour satisfaire la demande et ensuite on vient nous dire, mais si il y a ça, ou ça, mais je ne veux pas ça, ça ne marche pas parce que...
;-\
:) pas de problème !
Non justement il n'y a aucune ressemblance dans le nom ou la syntaxe de ces fonctions excepte la présence d'un nombre en argument. Il peut y avoir d'autres fonctions dont le nom commence par la même chose. Il doit y avoir plus de 10000 fichiers source...
Les seuls points qui les différencient sont ceux que j'ai cités !
Pour le reste du code j'aimerai éviter si possible, je n'en ai pas le droit. Mais c'est du code c normal.
J'espère que ca suffira !
Non justement il n'y a aucune ressemblance dans le nom ou la syntaxe de ces fonctions excepte la présence d'un nombre en argument. Il peut y avoir d'autres fonctions dont le nom commence par la même chose. Il doit y avoir plus de 10000 fichiers source...
Les seuls points qui les différencient sont ceux que j'ai cités !
Pour le reste du code j'aimerai éviter si possible, je n'en ai pas le droit. Mais c'est du code c normal.
J'espère que ca suffira !
Je propose un autre raisonnement pour ça.
Il n'y a pas de { dans le prototype (la déclaration) de la fonction, mais dans la définition de la fonction
Vu que le prototype d'une fonction commence avec le nom de la fonction et qu'il y a des règles de nommage pour le nom de la fonction (commence avec une lettre et peux contenir des chiffres et underscore) suivi ou pas d'espace ensuite une parenthèse ouvrante et puis les paramètres et puis espaces ou pas et à la fin parenthèse fermante suivi de ;
Ce qui donnera la recherche de paragraphe ou ligne (je n'ai pas testé)
Pour ligne
/^[a-zA-Z][a-zA-Z0-9_]\s+\([a-zA-Z0-9_,\s]*\)\s* ;/
Pour paragraphe
/^[a-zA-Z][a-zA-Z0-9_]\s+/ .. /\)\s* ;/
Il n'y a pas de { dans le prototype (la déclaration) de la fonction, mais dans la définition de la fonction
Vu que le prototype d'une fonction commence avec le nom de la fonction et qu'il y a des règles de nommage pour le nom de la fonction (commence avec une lettre et peux contenir des chiffres et underscore) suivi ou pas d'espace ensuite une parenthèse ouvrante et puis les paramètres et puis espaces ou pas et à la fin parenthèse fermante suivi de ;
Ce qui donnera la recherche de paragraphe ou ligne (je n'ai pas testé)
Pour ligne
/^[a-zA-Z][a-zA-Z0-9_]\s+\([a-zA-Z0-9_,\s]*\)\s* ;/
Pour paragraphe
/^[a-zA-Z][a-zA-Z0-9_]\s+/ .. /\)\s* ;/
Essaye ça (test effectué sur l'exemple du post #7) :
$ sed -n '/.* (/{:z;N;/);$/!bz;/1250\|1990/p}' romzz admn_ano_ ( (message_struct_def *)msg_sco_p, (context_struct_def *)ctx_glob_p, (u16)1250, (s16)nouvel_etat ); admn_em_ano ( (id_classe_t)VAL_IRT_FCT_PADMN, ANO_NON_SIGNIFICATIVE, (u32) 0, (u16)1990, (u16) 0, (u8*) NULL, (u16) 0, (u8*) NULL, (u16) 0, (u8*) NULL );
C'est exactement ca que je voudrais, mais encore (tu m'avais déjà conseille sur sed la dernière fois) un @#&!!%$ de problème avec sed sous Solaris je pense :
sed -n '/.* (/{:z;N;/);$/!bz;/1250\|1990/p}' padmn.c > resultpad
bz: Event not found.
C'est assez chiant ca...
En tout cas merci beaucoup, je vais essayer de traduire ca en sed Solaris...
sed -n '/.* (/{:z;N;/);$/!bz;/1250\|1990/p}' padmn.c > resultpad
bz: Event not found.
C'est assez chiant ca...
En tout cas merci beaucoup, je vais essayer de traduire ca en sed Solaris...
J'ai mis ca dans un script (dans une console je ne vois pas comment faire) et ca enlève le message d'erreur mais le fichier de résultat est vide.
Il doit y avoir une syntaxe particulière pour le "bz"...
PS : les nombres 1250 et 1990 c'était pour l'exemple, elles contiennent en fait toute un nombre qui peut prendre n'importe quelle valeur suivant la fonction (unicité). Le but final étant de placer une variable shell script à la place de ce nombre dans la commande sed pour pouvoir récupérer la fonction que je veux dans tout le code.
Il doit y avoir une syntaxe particulière pour le "bz"...
PS : les nombres 1250 et 1990 c'était pour l'exemple, elles contiennent en fait toute un nombre qui peut prendre n'importe quelle valeur suivant la fonction (unicité). Le but final étant de placer une variable shell script à la place de ce nombre dans la commande sed pour pouvoir récupérer la fonction que je veux dans tout le code.
Re,
--
GNU/Linux:Linux is Not Ubuntu! Quel linux choisir ne veut pas dire votre Distribution préférée,
106485010510997108
~ $ cat c.c Voilà par exemple un extrait du fichier c : ***************************************************************/ admn_ano_ ( (message_struct_def *)msg_sco_p, (context_struct_def *)ctx_glob_p, (u16)1250, (s16)nouvel_etat ); ****************/ admn_em_ano ( (id_classe_t)VAL_IRT_FCT_PADMN, ANO_NON_SIGNIFICATIVE, (u32) 0, (u16)1990, (u16) 0, (u8*) NULL, (u16) 0, (u8*) NULL, (u16) 0, (u8*) NULL ); ***************************************************************/ ~ $ awk 'BEGIN { RS = "" } /[a-zA-Z_] \(.*1250|1990/ , /).*;/' c.c admn_ano_ ( (message_struct_def *)msg_sco_p, (context_struct_def *)ctx_glob_p, (u16)1250, (s16)nouvel_etat ); admn_em_ano ( (id_classe_t)VAL_IRT_FCT_PADMN, ANO_NON_SIGNIFICATIVE, (u32) 0, (u16)1990, (u16) 0, (u8*) NULL, (u16) 0, (u8*) NULL, (u16) 0, (u8*) NULL );
--
GNU/Linux:Linux is Not Ubuntu! Quel linux choisir ne veut pas dire votre Distribution préférée,
106485010510997108
Effectivement je crois qu'avec awk il n'y a pas ces problèmes sous Solaris, cependant :
~/Documents>awk 'BEGIN { RS = "" } /[a-zA-Z_] \(.*1250|1990/ , /).*;/' padmn.c
awk: syntax error near line 1
awk: bailing out near line 1
Désolé :(
PS : et pour un seul nombre par exemple 1250 au lieu de (1250|1990) ?
~/Documents>awk 'BEGIN { RS = "" } /[a-zA-Z_] \(.*1250|1990/ , /).*;/' padmn.c
awk: syntax error near line 1
awk: bailing out near line 1
Désolé :(
PS : et pour un seul nombre par exemple 1250 au lieu de (1250|1990) ?
~/Documents>nawk 'BEGIN { RS = "" } /[a-zA-Z_] \(.*1250|1990/ , /).*;/' padmn.c
nawk: illegal primary in regular expression ).*; at .*;
source line number 1
context is
BEGIN { RS = "" } /[a-zA-Z_] \(.*1250|1990/ , >>> /).*;/ <<<
Je t'ai dit tu peux surement faciliter l'expression en ne recherchant qu'un seul nombre parmi les deux !
nawk: illegal primary in regular expression ).*; at .*;
source line number 1
context is
BEGIN { RS = "" } /[a-zA-Z_] \(.*1250|1990/ , >>> /).*;/ <<<
Je t'ai dit tu peux surement faciliter l'expression en ne recherchant qu'un seul nombre parmi les deux !