Befehl zum Escapezeichen einer Zeichenfolge in Bash


97

Ich benötige einen Bash-Befehl, der eine Zeichenfolge in etwas konvertiert, das maskiert ist. Hier ist ein Beispiel:

echo "hello\world" | escape | someprog

Wo der Escape - Befehl macht "hello\world"in "hello\\\world". Dann kann someprog "hello\\world"wie erwartet verwenden. Dies ist natürlich ein vereinfachtes Beispiel dafür, was ich wirklich tun werde.


5
Was ist die Art der Flucht? Mit anderen Worten, welche Zeichen müssen entkommen? Suchen Sie ein Escape im C ++ - Stil (bei dem Tabulatoren durch \ t, Zeilenumbrüche durch \ n, Anführungszeichen mit \ "usw. ersetzt werden)? Es ist schwer zu helfen, ohne dass das Problem genau definiert ist.
Michael Aaron Safyan

2
Mögliches Duplikat des Echos, das Argumenten entgeht
P Shved

Diese Frage könnte ein Dutzend verschiedener Dinge bedeuten. Anstatt uns raten zu lassen, wäre es hilfreich, wenn Sie genau angeben, nach welcher Art von Flucht Sie suchen.
Don Hatch

1
Die Frage war spezifisch für die Verwendung von \\ für \. Es gibt eine akzeptierte Antwort.
User1

Antworten:


154

In Bash:

printf "%q" "hello\world" | someprog

beispielsweise:

printf "%q" "hello\world"
hello\\world

Dies könnte auch durch Variablen verwendet werden:

printf -v var "%q\n" "hello\world"
echo "$var"
hello\\world

6
Wohlgemerkt, %qwar mehr als ein Jahrzehnt lang bis etwa 2012 kaputt. Es hatte Probleme mit ~. Es gibt auch tragbare sed Einzeiler stackoverflow.com/a/20053121/1073695
Jo So

1
sed ist in der Tat besser, weil auch Dollarzeichen entkommen können
bis

2
@untore: a='abc$def":'; printf '%q\n' "$a"führt zu abc\$def\":(das Dollarzeichen wird maskiert ). Dies ist Bash 4.3 (ich habe das gleiche Ergebnis in Bash 3.2 erhalten). Welche Version verwenden Sie?
Bis auf weiteres angehalten.

3
printf "%q" 'he$l&lo\world'
Um

bashs printf '%q\n' textzitiert den Text im bashFormat (und für das aktuelle Gebietsschema), sodass dies im Fall des OP nur funktionieren würde, wenn someproggenau dieselbe Anführungszeichen-Syntax verwendet würde, bashdie höchst unwahrscheinlich ist.
Stephane Chazelas

9

Pure Bash, verwenden Sie die Parametersubstitution:

string="Hello\ world"
echo ${string//\\/\\\\} | someprog

1
Auf diese Weise wird "Hallo Welt" nicht zu "Hallo \ Welt" entkommen - printf Ansatz in akzeptierter Antwort macht das.
Vchrizz

1
Außerdem entkommt "% q" nicht '/' wie in "25.03.2017", das ich auf "03 \ / 25 \ / 2017" maskieren musste (damit es in einem durch '/' getrennten Stamm enthalten sein kann Ausdruck).
Wrlee

0

Sie können Perl verwenden, um verschiedene Zeichen zu ersetzen, zum Beispiel:

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

Abhängig von der Art Ihrer Flucht können Sie mehrere Anrufe verketten, um den richtigen Zeichen zu entkommen.


1
Warum nicht sed? $ echo "hallo \ world" | sed 's / \\ / \\\\ /'
Space

1
@ Octopus, das ist auch eine gültige Option. Ich fühle mich mit Perl wohler, aber ja, das funktioniert auch.
Michael Aaron Safyan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.