PmGs
Novembre 23, 2020, 11:26
1
Bonjour à tous,
v='a\b';tr '\\' '\\\\' <<< "$v" -> a\b KO ???????
v='a\b';tr '\\' 'x' <<< "$v" -> axb Ok
v='a\b';v=${v/\\/\\\\};echo "$v" -> a\\b OK
Un lecteur peut-il expliquer pourquoi la cde via tr ne fonctionne pas?
Bonjour
La commande tr remplace un caractère par un autre
ou chaque caractère d’une liste de caractères
par chaque caractère d’une autre liste de caractères :
michel@ubuT450:~$ v='a-b-c';echo "$v";tr 'a' '.' <<< "$v"
a-b-c
.-b-c
michel@ubuT450:~$ v='a-b-c';echo "$v";tr 'abc' '.' <<< "$v"
a-b-c
.-.-.
michel@ubuT450:~$ v='a-b-c';echo "$v";tr '\-' '.' <<< "$v"
a-b-c
a.b.c
michel@ubuT450:~$ v='a-b-c';echo "$v";tr '\-' '\\' <<< "$v"
a-b-c
a\b\c
michel@ubuT450:~$ v='a-b-c';echo "$v";tr '\-abc' '\\123' <<< "$v"
a-b-c
1\2\3
michel@ubuT450:~$ v='a-b-c';echo "$v";tr '\-abc' '\\' <<< "$v"
a-b-c
\\\\\
michel@ubuT450:~$
et pas un caractère par une chaîne de caractères
ni une chaîne de caractères par un caractère ou une autre chaîne de caractères.
PmGs
Novembre 23, 2020, 2:01
3
Effectivement !
v='a\b';tr '\\' 'xx' <<< "$v" -> axb OK donc
Oui,
Ci-dessous,
il y a eu remplacement du caractère \ (qui a été « échappé » par le \ qui le précède)
par le premier caractère de l’autre liste qui est un x
michel@ubuT450:~$ v='a\b';echo "$v";tr '\\' 'xx' <<< "$v"
a\b
axb
michel@ubuT450:~$ v='a\b';echo "$v";tr '\\' 'xYZ' <<< "$v"
a\b
axb
michel@ubuT450:~$
Il n’y avait qu’un seul caractère dans la première liste => le premier caractère de l’autre liste a été utilisé pour le remplacer.
Ci-dessous, avec la même liste de caractères de remplacement,
il y a deux caractères dans la liste des caractères à remplacer :
michel@ubuT450:~$ v='a\b';echo "$v";tr 'b\\' 'xYZ' <<< "$v"
a\b
aYx
michel@ubuT450:~$