Wie kann ich vor jedem Leerzeichen einen Backslash setzen, vorzugsweise mithilfe von tr
oder sed
Befehlen?
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
tr x ' '
, wox
ist der Charakter, den du ersetzen möchtest?Antworten:
tr
kann nicht mehrere Zeichen machen. Verwenden Sie stattdessen eine davon:sed
oder
Perl
oder
Perl hat auch eine raffinierte Funktion namens,
quotemeta
die allen seltsamen Dingen in einem String entkommen kann:Das obige wird gedruckt
Sie können auch verwenden
printf
und%q
:Also könntest du es tun
Beachten Sie, dass diese, wie Perl
quotemeta
entweicht alle Sonderzeichen, nicht nur Räume.Wenn Sie die Zeile in einer Variablen haben, können Sie dies einfach direkt in bash tun:
quelle
printf
builtin hat eine ähnliche Funktionalität wiequotemeta
-printf '%q\n' "$line"
sollte es IIRC tun.Es wird
AWK
in der Liste aller möglichen Lösungen fehlt :)quelle