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 supposé remplacer les espaces par une barre oblique inverse suivie d'un espace, mais il ne remplace que les espaces par une barre oblique inverse et non par une barre oblique inverse + espace.
Voici le résultat obtenu:
hello\bye
Production attendue:
hello\ bye
tr
ne peut pas faire plusieurs caractères. Utilisez plutôt l'un de ceux-ci:
sed
name__
echo "$line" | sed 's/ /\\ /g'
ou
sed 's/ /\\ /g' <<< "$line"
Perl
echo "$line" | Perl -pe 's/ /\\ /g'
ou
Perl -pe 's/ /\\ /g'<<< "$line"
Perl a également une fonction astucieuse appelée quotemeta
qui peut échapper à toutes les choses étranges d'une chaîne:
line='@!#$%^&*() _+"'
Perl -ne 'print quotemeta($_)' <<< $line
Ce qui précède imprimera
\@\!\#\$\%\^\&\*\(\)\ _\+\"\
Vous pouvez également utiliser printf
and %q
:
%q quote the argument in a way that can be reused as Shell input
Alors tu pourrais faire
echo "$line" | printf "%q\n"
Notez que ceci, comme le quotemeta
de Perl, échappera tous caractères spéciaux, pas seulement les espaces.
printf "%q\n" <<<$line
Si vous avez la ligne dans une variable, vous pouvez le faire directement dans bash:
echo ${line// /\\ }
Il manque AWK
dans la liste de toutes les solutions possibles :)
$ echo "Hello World" | awk '{gsub(/ /,"\\ ");print}'
Hello\ World