Remplacement d'une chaine dans une variable

[Résolu/Fermé]
Signaler
Messages postés
40
Date d'inscription
jeudi 10 mai 2012
Statut
Membre
Dernière intervention
11 août 2015
-
Messages postés
18253
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
27 août 2021
-
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

Messages postés
18253
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
27 août 2021
5 344
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
$
Messages postés
40
Date d'inscription
jeudi 10 mai 2012
Statut
Membre
Dernière intervention
11 août 2015

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?

à 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.
Messages postés
40
Date d'inscription
jeudi 10 mai 2012
Statut
Membre
Dernière intervention
11 août 2015

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 !
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 332
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

$

Messages postés
18253
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
27 août 2021
5 344
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
$