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
    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
    $
    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. 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. à 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. 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. 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
              $