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

8

Comment puis-je mettre une barre oblique inverse avant chaque espace, de préférence en utilisant les commandes trou 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
daka
la source
Pourriez-vous nous en dire un peu plus à ce sujet? Vous recherchez un script qui modifie un fichier texte? Que recherchez vous exactement?
Fabby
tr x ' ', où xest le personnage que vous souhaitez remplacer?
Poignée de porte
mise à jour - exemple ajouté.
daka

Réponses:

17

trne peut pas faire plusieurs caractères. Utilisez-en plutôt un:

  1. sed

    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 dans une chaîne:

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

    Ce qui précède s'imprimera

    \@\!\#\$\%\^\&\*\(\)\ _\+\"\
    
  3. Vous pouvez également utiliser printfet %q:

    %q  quote the argument in a way that can be reused as shell input
    

    Donc, vous pourriez faire

    echo "$line" | printf "%q\n" 
    

    Notez que cela, comme Perl, quotemetaéchappera à tous les caractères spéciaux, pas seulement aux espaces.

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

    echo ${line// /\\ }
    
terdon
la source
oui cela fonctionne, mais ne fonctionne pas lorsque vous souhaitez remplacer toutes les occurrences de "a" par un jeu + espace.
daka
@sudoman J'ai ajouté quelques options supplémentaires car vous avez déjà la ligne dans une variable.
terdon
La fonction printfintégrée de Bash a des fonctionnalités similaires à quotemeta- printf '%q\n' "$line"devrait le faire IIRC.
evilsoup
4

Il AWKmanque dans la liste de toutes les solutions possibles :)

$ echo "Hello World" | awk '{gsub(/ /,"\\ ");print}'                                                                             
Hello\ World
Sergiy Kolodyazhnyy
la source