2010-05-18 9 views
58

Ich brauche einen Bash-Befehl, der eine Zeichenfolge in etwas umwandeln wird, die maskiert ist. Hier ist ein Beispiel:Befehl, um eine Zeichenfolge in Bash zu entkommen

 
echo "hello\world"|escape|someprog 

Wo der Escape-Befehl macht "Hallo \ Welt" in "Hallo \\ Welt". Dann kann someprog "Hallo \ Welt" verwenden, wie es erwartet. Natürlich ist dies ein vereinfachtes Beispiel dafür, was ich wirklich tun werde.

+5

Was ist die Art der Flucht? Mit anderen Worten, welche Zeichen müssen maskiert werden? Suchen Sie nach einem C++ - Stil Escape (wo Registerkarten durch \ t, Zeilenumbrüche mit \ n, Anführungszeichen mit \ "usw.)? Es ist schwer zu helfen, ohne das Problem gut definiert. –

+2

mögliche Duplikat von [ Echo, dass Shell-Escape-Argumente] (http://stackoverflow.com/questions/2731883/echo-that-shell-escapes-arguments) –

Antwort

102

In Bash:

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

zum Beispiel:

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

Auch dies durch Variablen verwendet werden könnten:

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

Wohlgemerkt, '% q' war mehr als ein Jahrzehnt lang bis etwa 2012 unterbrochen. Es hatte Probleme mit' ~ '. Es gibt auch portable sed One-Liner http://stackoverflow.com/a/20053121/1073695 –

+1

sed ist in der Tat besser, weil Dollar Zeichen auch zu entkommen – untore

+1

@untore: 'a = 'abc $ def":'; printf '% q \ n '"$ a" 'resultiert in' abc \ $ def \ ":' (das Dollarzeichen ist maskiert). Dies ist Bash 4.3 (ich habe das gleiche Ergebnis in Bash 3.2). Welche Version verwendest du? –

1

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

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

Je nach Art Ihrer Flucht, können Sie Kette mehr Anrufe, die richtigen Zeichen zu entkommen.

+1

Warum nicht sed? $ echo "Hallo \ Welt" | sed 's/\\/\\\\\ ' – Space

+1

@Octopus, das ist auch eine gültige Option.Ich zufällig mit Perl besser zu sein, aber ja, das funktioniert auch .. –

5

reine Bash, verwenden Sie den Parameter Substitution:

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

Möchten Sie mehr wissen? Http: //wiki.bash-hackers. org/syntax/pe # search_and_replace –

+1

so wird "hallo world" nicht in "hallo \ world" maskiert - printf aproach in akzeptierter antwort tut das. – vchrizz

+1

Auch "% q" entkommt nicht '/' wie in "03/25/2017 ", dem ich nach" 03 \/25 \/2017 "entkommen musste (so dass es in einem '/' abgegrenzten regulären Ausdruck sein könnte). – wrlee

Verwandte Themen