Remplacement d'une chaine dans une variable

Résolu
Bonjour,

La question a déjà été posée mais uniquement au niveau de fichiers... Je vous la pose donc pour une variable =)

J'ai actuellement trois variables :
var1=$(echo "chose")
var2=$(echo "truc")
var3=$(echo "je/veux/changer/ce/machin/$var1")

var3 = je/veux/changer/ce/machin/chose

var1 apparait donc dans var3 et je souhaiterais pouvoir l'échanger avec var2 pour avoir :
var3=$(echo "je/veux/changer/ce/machin/$var2")

var3 = je/veux/changer/ce/machin/truc

J'ai donc pensé à cette ligne de code : (qui ne marche pas)
var3=$(echo $var3 | sed 's/$var1/$var2/')

résultat : je/veux/changer/ce/machin/chose


par contre, celle que j'avais trouvé sur le net marche :
var3=$(echo $var3 | sed 's/chose/truc/')

résultat : je/veux/changer/ce/machin/truc


Quelqu'un pourrait m'aider?
Merci !

6 réponses

  1. Contributeur
    hello
    les $(echo ... sont inutiles
    les variables ne sont pas résolues entre ', essayer entre "
    var3=$(echo $var3 | sed "s/$var1/$var2/")
    ou en bash
    $ var1="chose"
    $ var2="truc"
    $ var3="je/veux/changer/ce/machin/$var1"
    $ echo $var3
    je/veux/changer/ce/machin/chose
    $ echo ${var3/$var1/$var2}
    je/veux/changer/ce/machin/truc
    $
    1. En effet, çà marche bien!
      sauf dans mon cas =/

      enfait, je ne défini pas
      var3="je/veux/changer/ce/machin/$var1"
      mais plutôt
      var3=$(pwd)

      La commande
      echo $var3
      m'affiche le même résultat dans les deux cas ; par contre la commande
      echo ${var3/$var1/$var2}
      marche dans le premier cas mais pas dans le deuxième...

      Mais si je souhaite faire différemment :

      1 - récupérer le nom qu'il y a entre le 9ieme "/" et le 10ieme "/" par exemple
      2 - le remplacer par le contenu d'une variable

      Exemple :

      var3=$(pwd)  #je/veux/changer/ce/machin/chose/bidule/chouette

      1er etape : récupérer chose dans var1
      2e etape : le remplacer par var2

      Je sais déjà comment compter les "/" mais pas comment les exploiter...

      $ function test_chaine { #Compter le nombre de "/" dans une chaine
      $ ChaineA=$(pwd)
      $ NbSlashs1=$(echo $(pwd) | tr -d -c "/" | wc -c)
      $ }
      $ test_chaine
      $ echo "Il y a $NbSlashs1 Niveau(x) de sous-arborescence(s)"

      Il y a 7 Niveau(x) de sous-arborescence(s)

      Je pense çà faisable ; mon seul problème, c'est pour retrouver la position du 9ième "/" ; t'aurais une suggestion?
      1. à mon avis, et d'après ce que j'ai pu déjà voir de ta façon de coder, tu fais fausse-route; tu sembles sur-compliquer les choses pour compenser un problème mal posé, et donc tu colles des rustines sur une chambre à air poreuse.

        la prochaine étape, c'est quoi ? variabiliser le nombre de slashes en fonction d'un autre paramètre ?

        révise ton algorithme.
        1. Rectification : çà marche nickel !
          Même en déclarant var3=$(pwd)...

          J'avais fais une erreur de frappe :-\

          Ceci dit, la deuxième solution peut être intéressante ;-)

          En tout cas merci beaucoup !
          1. Contributeur
            Salut,

            $ A="truc"

            $ B="je/veux/changer/ce/machin/chose/bidule/chouette"

            $ C=$(sed 's|\([^/]*/\)\{6\}\(.*\)|\1|' <<<${B})

            $ echo "${B//${C//\//}/${A}}"
            je/veux/changer/ce/machin/truc/bidule/chouette

            $

            1. Contributeur
              avec awk
              $ A="truc"
              $ B="je/veux/changer/ce/machin/chose/bidule/chouette"
              $ C=$(awk -v a="$A" 'BEGIN{FS=OFS="/"} {$6=a; print}' <<<"$B")
              $ echo $C
              je/veux/changer/ce/machin/truc/bidule/chouette
              ## ou
              $ C=$(awk -v a="$A" 'BEGIN{FS=OFS="/"} {$(NF-2)=a; print}' <<<"$B")
              $ echo $C
              je/veux/changer/ce/machin/truc/bidule/chouette
              $