Remplacement d'une chaine dans une variable

Résolu
sym59 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
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. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
    $
    0
  2. sym59 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention  
     
    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?
    0
  3. Utilisateur anonyme
     
    à 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.
    0
  4. sym59 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention  
     
    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 !
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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

    $

    0
  7. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
    $
    0