Comment puis-je mettre une barre oblique inverse avant chaque espace, de préférence en utilisant les commandes tr
ou sed
?
Voici mon script:
#!/bin/bash
line="hello bye"
echo $line | tr ' ' "\\\ "
Ceci est censé remplacer les espaces par une barre oblique inverse suivie d'un espace, mais cela ne fait que remplacer les espaces par une barre oblique inversée et non par une barre oblique inverse + espace.
Voici la sortie que j'obtiens:
hello\bye
Production attendue:
hello\ bye
tr x ' '
, oùx
est le personnage que vous souhaitez remplacer?Réponses:
tr
ne peut pas faire plusieurs caractères. Utilisez-en plutôt un:sed
ou
Perl
ou
Perl a également une fonction astucieuse appelée
quotemeta
qui peut échapper à toutes les choses étranges dans une chaîne:Ce qui précède s'imprimera
Vous pouvez également utiliser
printf
et%q
:Donc, vous pourriez faire
Notez que cela, comme Perl,
quotemeta
échappera à tous les caractères spéciaux, pas seulement aux espaces.Si vous avez la ligne dans une variable, vous pouvez simplement le faire directement dans bash:
la source
printf
intégrée de Bash a des fonctionnalités similaires àquotemeta
-printf '%q\n' "$line"
devrait le faire IIRC.Il
AWK
manque dans la liste de toutes les solutions possibles :)la source