web-dev-qa-db-fra.com

Comment puis-je ajouter une barre oblique inverse avant tous les espaces?

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
7
daka

trne peut pas faire plusieurs caractères. Utilisez plutôt l'un de ceux-ci:

  1. sedname__

    echo "$line" | sed 's/ /\\ /g' 
    

    ou

    sed 's/ /\\ /g' <<< "$line"
    
  2. Perl

    echo "$line" | Perl -pe 's/ /\\ /g'  
    

    ou

    Perl -pe 's/ /\\ /g'<<< "$line"
    

    Perl a également une fonction astucieuse appelée quotemetaqui peut échapper à toutes les choses étranges d'une chaîne:

    line='@!#$%^&*() _+"'
    Perl -ne 'print quotemeta($_)' <<< $line
    

    Ce qui précède imprimera

    \@\!\#\$\%\^\&\*\(\)\ _\+\"\
    
  3. Vous pouvez également utiliser printfand %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 quotemetade Perl, échappera tous caractères spéciaux, pas seulement les espaces.

    printf "%q\n" <<<$line
    
  4. Si vous avez la ligne dans une variable, vous pouvez le faire directement dans bash:

    echo ${line// /\\ }
    
14
terdon

Il manque AWK dans la liste de toutes les solutions possibles :)

$ echo "Hello World" | awk '{gsub(/ /,"\\ ");print}'                                                                             
Hello\ World
4