OVH Cloud OVH Cloud

sed remplacement

6 réponses
Avatar
Guillaume Desticourt
bonjour,

j ai fait un petit script pour ajouter une ligne en dessous d une
autre dans un source C. la ligne repere est de la forme:
{ID_LEX_CIRCUM, &state_022},
et je souhaite ajouter:
{ID_LEX_PERCENT, &state_022},
le numero d etat devant rester le meme.
j ai ecrit ca:
#! /bin/sh

for i in `grep CIRCUM *.c | cut -d':' -f1`
do
echo $i
id=`grep CIRCUM $i | awk '{print $2}'`
line=`grep -n CIRCUM $i | cut -d':' -f1`
echo STATE: $i:$line
sed -e "a/\(ID_LEX_CIRCUM\)/pouet\1pouet/g" $i
done

mais il m affiche ca:
...
/(ID_LEX_CIRCUM)/pouet1pouet/g
....
alors que je voudrais:
pouetID_LEX_CIRCUMpouet

un petit coup de pouce serait le bienvenu.
merci d avance,

--
Guillaume Desticourt

6 réponses

Avatar
Pascal Bourguignon
Guillaume Desticourt writes:

bonjour,

j ai fait un petit script pour ajouter une ligne en dessous d une
autre dans un source C. la ligne repere est de la forme:
{ID_LEX_CIRCUM, &state_022},
et je souhaite ajouter:
{ID_LEX_PERCENT, &state_022},
le numero d etat devant rester le meme.
j ai ecrit ca:
#! /bin/sh

for i in `grep CIRCUM *.c | cut -d':' -f1`
do
echo $i
id=`grep CIRCUM $i | awk '{print $2}'`
line=`grep -n CIRCUM $i | cut -d':' -f1`
echo STATE: $i:$line
sed -e "a/(ID_LEX_CIRCUM)/pouet1pouet/g" $i
done

mais il m affiche ca:
...
/(ID_LEX_CIRCUM)/pouet1pouet/g
....
alors que je voudrais:
pouetID_LEX_CIRCUMpouet

un petit coup de pouce serait le bienvenu.
merci d avance,


[ tmp]$ cat toto.c
struct truct_s truc = {
{ID_LEX_CIRCUM, &state_022},
{ID_REX_CIRCUM, &state_023},
{0,0}};
/*** toto.c -- 2003-12-09 17:10:21 -- pascal ***/

[ tmp]$ cat toto.sed
/CIRCUM/{
p
s/({ID_[^_]*)_CIRCUM(,.*},)/1_PERCENT2/
}

[ tmp]$ sed -f toto.sed < toto.c
struct truct_s truc = {
{ID_LEX_CIRCUM, &state_022},
{ID_LEX_PERCENT, &state_022},
{ID_REX_CIRCUM, &state_023},
{ID_REX_PERCENT, &state_023},
{0,0}};
/*** toto.c -- 2003-12-09 17:10:21 -- pascal ***/

[ tmp]$ sed -e '/CIRCUM/{' -e 'p' -e 's/({ID_[^_]*)_CIRCUM(,.*},)/1_PERCENT2/' -e '}' < toto.c
struct truct_s truc = {
{ID_LEX_CIRCUM, &state_022},
{ID_LEX_PERCENT, &state_022},
{ID_REX_CIRCUM, &state_023},
{ID_REX_PERCENT, &state_023},
{0,0}};
/*** toto.c -- 2003-12-09 17:10:21 -- pascal ***/

--
__Pascal_Bourguignon__ . * * . * .* .
http://www.informatimago.com/ . * . .*
* . . / () . *
Living free in Alaska or in Siberia, a . . / . . * .
grizzli's life expectancy is 35 years, .*. / * . .
but no more than 8 years in captivity. . /* o .
http://www.theadvocates.org/ * '''||''' .
SCO Spam-magnet: ******************

Avatar
Guillaume Desticourt
c est un peu mysterieux comme ca, mais je vais y
reflechir. (comprendre comparer avec la doc.)
merci pour ton aide,

--
Guillaume Desticourt
Avatar
Pascal Bourguignon
Guillaume Desticourt writes:

c est un peu mysterieux comme ca, mais je vais y
reflechir. (comprendre comparer avec la doc.)
merci pour ton aide,


Sed peut prendre des commandes sur plusieurs lignes (ou plusieurs
arguments -e). Les accolades servent à activer plusieurs commandes
sur une "adresse" (la regexp /CIRCUM/).

[ tmp]$ cat toto.sed
/CIRCUM/{
p
s/({ID_[^_]*)_CIRCUM(,.*},)/1_PERCENT2/
}

signifie: sur toutes les lignes où on trouve CIRCUM (/CIRCUM/),
imprimer la ligne (p), puis substituer de '{ID_' à '},' (en mémorisant
ce qu'il y a avant et après '_CIRCUM' ( ( et ) ), par ce qu'il y
avait avant, '_PERCENT' et ce qu'il y avait après.

Comme on n'a pas mis d'option -n à sed, il fini par imprimer la ligne
ainsi modifiée, et sinon imprime toutes les autres lignes où il n'y a
pas CIRCUM.

--
__Pascal_Bourguignon__ . * * . * .* .
http://www.informatimago.com/ . * . .*
There is no worse tyranny than to force * . . / () . *
a man to pay for what he does not . . / . . * .
want merely because you think it .*. / * . .
would be good for him. -- Robert Heinlein . /* o .
http://www.theadvocates.org/ * '''||''' .
SCO Spam-magnet: ******************

Avatar
Sebastien Moretti
bonjour,
Bonjour,

j ai fait un petit script pour ajouter une ligne en dessous d une
autre dans un source C. la ligne repere est de la forme:
{ID_LEX_CIRCUM, &state_022},
et je souhaite ajouter:
{ID_LEX_PERCENT, &state_022},
le numero d etat devant rester le meme.
j ai ecrit ca:
#! /bin/sh

for i in `grep CIRCUM *.c | cut -d':' -f1`
do
echo $i
id=`grep CIRCUM $i | awk '{print $2}'`
line=`grep -n CIRCUM $i | cut -d':' -f1`
echo STATE: $i:$line
sed -e "a/(ID_LEX_CIRCUM)/pouet1pouet/g" $i
done

mais il m affiche ca:
...
/(ID_LEX_CIRCUM)/pouet1pouet/g
....
alors que je voudrais:
pouetID_LEX_CIRCUMpouet

un petit coup de pouce serait le bienvenu.
merci d avance,



Lorsque sed foire, utilise les ' au lieu des ".
Les quotes simples prennnent mieux en compte les (.*) et les 1
correspondants.

--
Sebastien MORETTI
CNRS - IGS
31 chemin Joseph Aiguier
13402 Marseille cedex 20
tel. 04 91 16 44 55
06 61 88 59 00

Avatar
Pascal Bourguignon
Sebastien Moretti writes:
Lorsque sed foire, utilise les ' au lieu des ".
Les quotes simples prennnent mieux en compte les (.*) et les 1
correspondants.


$ echo '(1)'
(1)
$ echo "(1)"
(1)
$ [ "(1)" = '(1)' ] && echo yes || echo no
yes

--
__Pascal_Bourguignon__ . * * . * .* .
http://www.informatimago.com/ . * . .*
There is no worse tyranny than to force * . . / () . *
a man to pay for what he does not . . / . . * .
want merely because you think it .*. / * . .
would be good for him. -- Robert Heinlein . /* o .
http://www.theadvocates.org/ * '''||''' .
SCO Spam-magnet: ******************

Avatar
Guillaume Desticourt
Pascal Bourguignon writes:

Guillaume Desticourt writes:

c est un peu mysterieux comme ca, mais je vais y
reflechir. (comprendre comparer avec la doc.)
merci pour ton aide,


Sed peut prendre des commandes sur plusieurs lignes (ou plusieurs
arguments -e). Les accolades servent à activer plusieurs commandes
sur une "adresse" (la regexp /CIRCUM/).

[ tmp]$ cat toto.sed
/CIRCUM/{
p
s/({ID_[^_]*)_CIRCUM(,.*},)/1_PERCENT2/
}

signifie: sur toutes les lignes où on trouve CIRCUM (/CIRCUM/),
imprimer la ligne (p), puis substituer de '{ID_' à '},' (en mémorisant
ce qu'il y a avant et après '_CIRCUM' ( ( et ) ), par ce qu'il y
avait avant, '_PERCENT' et ce qu'il y avait après.

merci pour les explications.


maintenant j ai vu sur shellunix.com qu il existait la commande 'a' pour
ajouter quelque chose a la ligne suivante. est il possible d ajouter
une chaine n lignes plus loin?
(au hasard deux lignes en dessous de struct struc_s truc ;)

--
Guillaume Desticourt