Comment doubler une barre oblique inverse \ avec tr?

Tags: #<Tag:0x00007fe4dd19f450>

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.

1 J'aime

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:~$