it-swarm.com.de

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

Wie kann ich vor jedes Leerzeichen einen Backslash setzen, vorzugsweise mit den Befehlen tr oder sed?

Hier ist mein Drehbuch:

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

Dies soll Leerzeichen durch einen umgekehrten Schrägstrich gefolgt von einem Leerzeichen ersetzen, aber es ersetzt nur die Leerzeichen durch einen umgekehrten Schrägstrich und nicht durch ein Leerzeichen + Leerzeichen.

Dies ist die Ausgabe, die ich erhalte:

hello\bye

Erwartete Ausgabe:

hello\ bye
7
daka

tr kann nicht mehrere Zeichen enthalten. Verwenden Sie stattdessen eine der folgenden Optionen:

  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 quotemeta, die alle seltsamen Dinge in einer Zeichenfolge umgehen kann:

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

    Das Obige wird gedruckt

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

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

    Sie könnten es also tun

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

    Beachten Sie, dass dies, wie Perls quotemetaalle Sonderzeichen, nicht nur Leerzeichen, maskiert.

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

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

In der Liste aller möglichen Lösungen fehlt AWK :)

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