OVH Cloud OVH Cloud

Pbm avec Sed et SH

2 réponses
Avatar
aurelien_his
Bonjour à tous,

je m'arrache les cheveux sur un pbm avec Sed.
J'ai un shell qui est lancé en sh (je n'ai pas le choix), et qui doit
remplacer une chaine par une autre dans un fichier de properties
(cle=valeur). Voilà comment je procède :

FIC_PROPERTIES=/usr/applix/monFichier

MA_CHAINE=/conf/authentification/regle_acces_accessoires.rules

FIC_RULES=`printf '%s\n' "$FIC_RULES" | sed -e 's,[&\\/],\\&,g'`

sed 's/\(rulesFilePath=\).*$/\1'"$FIC_RULES"'/' $FIC_PROPERTIES >
fic.tmp

cp fic.tmp $FIC_PROPERTIES

rm fic.tmp

=> ce qui doit aboutir à avoir
"rulesFilePath=/conf/authentification/regle_acces_accessoires.rules"
dans mon fichier de properties final

C'est la 4e ligne qui remplace la valeur par ce qu'il faut. Seulement,
comme la valeur de remplacement MA_CHAINE contient des "/" (puisque
c'est un chemin vers un fichier), la commande Sed n'apprécie pas.
C'est pourquoi je fais une commande préliminaire (3e ligne) qui doit
faire précéder tous mes "/" par des "\".

Cette 3e ligne foire : au lieu de me remplacer les "/" par "\/", elle
me les remplace par des "&" !

Si je lance cette commande en ksh
FIC_RULES=`printf '%s\n' "$FIC_RULES" | sed -e 's,[&\\/],\\&,g'`
elle m'affiche aussi des "&" mais par contre si je la lance de cette
manière :
FIC_RULES=$(printf '%s\n' "$FIC_RULES" | sed -e 's,[&\\/],\\&,g')
cela fonctionne !!

L'embetant, c que je ne peux pas passer en ksh pour cette commande, je
dois trouver une solution en sh (sous SunOS).

Quelqu'un aurait-il une solution ?

Merci d'avance, je galère grave

AH

2 réponses

Avatar
TiChou
Dans le message <news:,
*AHis* tapota sur f.c.o.unix :

Bonjour à tous,


Bonjour,

je m'arrache les cheveux sur un pbm avec Sed.
J'ai un shell qui est lancé en sh (je n'ai pas le choix), et qui doit
remplacer une chaine par une autre dans un fichier de properties
(cle=valeur). Voilà comment je procède :

FIC_PROPERTIES=/usr/applix/monFichier

MA_CHAINE=/conf/authentification/regle_acces_accessoires.rules

FIC_RULES=`printf '%sn' "$FIC_RULES" | sed -e 's,[&/],&,g'`

sed 's/(rulesFilePath=).*$/1'"$FIC_RULES"'/' $FIC_PROPERTIES >
fic.tmp

cp fic.tmp $FIC_PROPERTIES

rm fic.tmp

=> ce qui doit aboutir à avoir
"rulesFilePath=/conf/authentification/regle_acces_accessoires.rules"
dans mon fichier de properties final

C'est la 4e ligne qui remplace la valeur par ce qu'il faut. Seulement,
comme la valeur de remplacement MA_CHAINE contient des "/" (puisque
c'est un chemin vers un fichier), la commande Sed n'apprécie pas.
C'est pourquoi je fais une commande préliminaire (3e ligne) qui doit
faire précéder tous mes "/" par des "".


Sans vouloir vous offenser, votre façon de faire et votre raisonnement ne
sont pas vraiment cohérents...

Vous invoquez ici le problème de l'utilisation des slashs '/' dans le champ
regexp ou dans le champ remplacement pour la commande sed à cause des
séparateurs slashs '/' de cette commande.

Seulement, dans votre première commande sed de votre script, vous montrez
que vous savez contourner ce problème, en utilisant un séparateur de champ
différent de celui habituellement utilisé à savoir ce fameux slash.

Alors pourquoi tout ce micmac dans votre script qui ne fait que «
l'embrouiller » alors qu'il vous suffit d'utiliser pour votre commande sed
finale la même « astuce » que précédemment, c'est-à-dire utiliser comme
séparateur un autre caractère que le slash '/'.

[...]

L'embetant, c que je ne peux pas passer en ksh pour cette commande, je
dois trouver une solution en sh (sous SunOS).

Quelqu'un aurait-il une solution ?


Tout simplement :

FIC_PROPERTIES=/usr/applix/monFichier

FIC_RULES=/conf/authentification/regle_acces_accessoires.rules

sed "s,(rulesFilePath=).*,1$FIC_RULES," < $FIC_PROPERTIES > fic.tmp

mv fic.tmp $FIC_PROPERTIES

Merci d'avance, je galère grave


De rien.

--
TiChou

Avatar
aurelien_his
Merci Tichou,

cela fonctionne parfaitement.

Concernant l'incohérence, elle est normale car je ne pratique pas du
tout les expressions régulières, étant pressé par le temps j'ai
récupéré des patterns qui fonctionnaient en ksh, mais difficiles à
débugger qd on ne connait pas...

je sais c pas bien le copier-coller, mais on a pas tjrs le temps de se
plonger dans toutes les problématiques... :)

En tout cas merci beaucoup pour votre aide,

Bonne journée

Aurélien

"TiChou" wrote in message news:...
Dans le message <news:,
*AHis* tapota sur f.c.o.unix :

Bonjour à tous,


Bonjour,

je m'arrache les cheveux sur un pbm avec Sed.
J'ai un shell qui est lancé en sh (je n'ai pas le choix), et qui doit
remplacer une chaine par une autre dans un fichier de properties
(cle=valeur). Voilà comment je procède :

FIC_PROPERTIES=/usr/applix/monFichier

MA_CHAINE=/conf/authentification/regle_acces_accessoires.rules

FIC_RULES=`printf '%sn' "$FIC_RULES" | sed -e 's,[&/],&,g'`

sed 's/(rulesFilePath=).*$/1'"$FIC_RULES"'/' $FIC_PROPERTIES >
fic.tmp

cp fic.tmp $FIC_PROPERTIES

rm fic.tmp

=> ce qui doit aboutir à avoir
"rulesFilePath=/conf/authentification/regle_acces_accessoires.rules"
dans mon fichier de properties final

C'est la 4e ligne qui remplace la valeur par ce qu'il faut. Seulement,
comme la valeur de remplacement MA_CHAINE contient des "/" (puisque
c'est un chemin vers un fichier), la commande Sed n'apprécie pas.
C'est pourquoi je fais une commande préliminaire (3e ligne) qui doit
faire précéder tous mes "/" par des "".


Sans vouloir vous offenser, votre façon de faire et votre raisonnement ne
sont pas vraiment cohérents...

Vous invoquez ici le problème de l'utilisation des slashs '/' dans le champ
regexp ou dans le champ remplacement pour la commande sed à cause des
séparateurs slashs '/' de cette commande.

Seulement, dans votre première commande sed de votre script, vous montrez
que vous savez contourner ce problème, en utilisant un séparateur de champ
différent de celui habituellement utilisé à savoir ce fameux slash.

Alors pourquoi tout ce micmac dans votre script qui ne fait que «
l'embrouiller » alors qu'il vous suffit d'utiliser pour votre commande sed
finale la même « astuce » que précédemment, c'est-à-dire utiliser comme
séparateur un autre caractère que le slash '/'.

[...]

L'embetant, c que je ne peux pas passer en ksh pour cette commande, je
dois trouver une solution en sh (sous SunOS).

Quelqu'un aurait-il une solution ?


Tout simplement :

FIC_PROPERTIES=/usr/applix/monFichier

FIC_RULES=/conf/authentification/regle_acces_accessoires.rules

sed "s,(rulesFilePath=).*,1$FIC_RULES," < $FIC_PROPERTIES > fic.tmp

mv fic.tmp $FIC_PROPERTIES

Merci d'avance, je galère grave


De rien.