Remplacement d 1 ligne ds un fichier

Résolu
abiss -  
 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
Configuration: solaris

2 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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 
    0
    1. abiss
       
      Salut,
      j ai la même erreur avec les deux propositions:
      sed: -e expression #1, char 27: unknown option to `s'
      Exit 1
      0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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

    0
    1. abiss
       
      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
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > 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
        ;-))
        0
      2. abiss > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Merci beaucoup
        0