Remplacement d 1 ligne ds un fichier
Résolu
Bonjour,
J'essaye d'écrire une fonction dans un script shell (ksh) qui remplace une partie d'une ligne par une autre. La ligne a remplacer commence par la chaine libdir= mais j'ai qques difficultés.
ma fonction prend en paramètre la nouvelle ligne et le fichier concerné.
replaceLine()
{
#cmd1
sed "s/\(^libdir=\)\(..*$\)/\1$1/" $2
#cmd2
sed 's/\(^libdir=\)\(..*$\)/\1$1/' $2
}
avec l'exécution de la cmd1 j'ai l'erreur suivante:
sed: -e expression #1, char 29: unknown option to `s'
Exit 1
avec l'exécution de la cmd2 le $1 n'est pas remplacé par son contenu mais utilisé comme tel:
Un autre point est que j'ai besoin du résultat dans le fichier passé en paramètre et non sur le stdin
Merci de votre aide
J'essaye d'écrire une fonction dans un script shell (ksh) qui remplace une partie d'une ligne par une autre. La ligne a remplacer commence par la chaine libdir= mais j'ai qques difficultés.
ma fonction prend en paramètre la nouvelle ligne et le fichier concerné.
replaceLine()
{
#cmd1
sed "s/\(^libdir=\)\(..*$\)/\1$1/" $2
#cmd2
sed 's/\(^libdir=\)\(..*$\)/\1$1/' $2
}
avec l'exécution de la cmd1 j'ai l'erreur suivante:
sed: -e expression #1, char 29: unknown option to `s'
Exit 1
avec l'exécution de la cmd2 le $1 n'est pas remplacé par son contenu mais utilisé comme tel:
Un autre point est que j'ai besoin du résultat dans le fichier passé en paramètre et non sur le stdin
Merci de votre aide
Configuration: solaris
2 réponses
-
Contributeurhello
le problème c'est les $ entre simples ou doubles quotes, essayer:
sed "s/\(^libdir=\)\(..*\$\)/\1$1/" $2 sed 's/\(^libdir=\)\(..*$\)/\1'"$1"'/' $2
-
ModérateurSalut,
Que contient ton paramètre "$1" ?
Sinon, la sous-expression "\(..*$\)" est inutile vu qu'apparemment elle cible tout le reste de la ligne, non ?
Essaye avec :sed 's/^libdir=/&'"$1"'/' $2
-
Bonjour,
je fais l'appel à la fonction avec les parametres suivants:
replaceLine \'/usr/local/BerkeleyDB.4.5/lib\' /tmp/test.txt
Exp:
j ai par example la ligne suivante:
...
libdir='/usr/lib'
...
Je veux remplacer ce qui le path /usr/lib par /usr/local/BerkeleyDB.4.5/lib
libdir='/usr/local/BerkeleyDB.4.5/lib'
Sinon la commande que vous m'avez fournit génère l'erreur suivante:
sed: -e expression #1, char 16: unknown option to `s'
Exit 1
Cdl -
Modérateur@abissIl faut changer le séparateur "/" dans la mesure ou il se trouve dans le motif de remplacement :
sed 's#^libdir=#&'"$1"'#' $2
de ce fait tu peux utiliser les quotes doubles (guillemets) :sed "s#^libdir=#&$1#" $2
;-))
-
@jipicyMerci beaucoup
-