Wie kann ich vor allen Leerzeichen einen Backslash einfügen?

8

Wie kann ich vor jedem Leerzeichen einen Backslash setzen, vorzugsweise mithilfe von troder sedBefehlen?

Hier ist mein Skript:

#!/bin/bash
line="hello bye"
echo $line | tr ' ' "\\\ "

Dies soll Leerzeichen durch einen Backslash gefolgt von einem Leerzeichen ersetzen, ersetzt jedoch nur die Leerzeichen durch einen Backslash und nicht durch Backlash + Leerzeichen.

Dies ist die Ausgabe, die ich bekomme:

hello\bye

Erwartete Ausgabe:

hello\ bye
Daka
quelle
Könnten Sie das bitte etwas näher erläutern? Suchen Sie ein Skript, das eine Textdatei ändert? was genau suchst du?
Fabby
tr x ' ', wo xist der Charakter, den du ersetzen möchtest?
Türknauf
aktualisiert - Beispiel hinzugefügt.
Daka

Antworten:

17

trkann nicht mehrere Zeichen machen. Verwenden Sie stattdessen eine davon:

  1. sed

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

    oder

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

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

    oder

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

    Perl hat auch eine raffinierte Funktion namens, quotemetadie allen seltsamen Dingen in einem String entkommen kann:

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

    Das obige wird gedruckt

    \@\!\#\$\%\^\&\*\(\)\ _\+\"\
    
  3. Sie können auch verwenden printfund %q:

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

    Also könntest du es tun

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

    Beachten Sie, dass diese, wie Perl quotemetaentweicht alle Sonderzeichen, nicht nur Räume.

    printf "%q\n" <<<$line
    
  4. Wenn Sie die Zeile in einer Variablen haben, können Sie dies einfach direkt in bash tun:

    echo ${line// /\\ }
    
Terdon
quelle
Ja, dies funktioniert, aber nicht, wenn alle Vorkommen von "a" durch ein Spiel + Leerzeichen ersetzt werden sollen.
Daka
@sudoman Ich habe einige weitere Optionen hinzugefügt, da Sie die Zeile bereits in einer Variablen haben.
Terdon
Bash printfbuiltin hat eine ähnliche Funktionalität wie quotemeta- printf '%q\n' "$line"sollte es IIRC tun.
Evilsoup
4

Es wird AWKin der Liste aller möglichen Lösungen fehlt :)

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