Remplacement d 1 ligne ds un fichier [Résolu/Fermé]

Signaler
-
 abiss -
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

2 réponses

Messages postés
18225
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
28 septembre 2020
5 017
hello
le problème c'est les $ entre simples ou doubles quotes, essayer:

sed "s/\(^libdir=\)\(..*\$\)/\1$1/" $2

sed 's/\(^libdir=\)\(..*$\)/\1'"$1"'/' $2 
Salut,
j ai la même erreur avec les deux propositions:
sed: -e expression #1, char 27: unknown option to `s'
Exit 1
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 770
Salut,

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
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 770 > abiss
Il 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
;-))
>
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020

Merci beaucoup