2010-05-18 15 views
58

Ho bisogno di un comando bash che convertirà una stringa in qualcosa che è sfuggito. Ecco un esempio:Comando per uscire da una stringa in bash

 
echo "hello\world"|escape|someprog 

cui il comando di fuga fa "ciao \ mondo" in "ciao \\ mondo". Quindi, qualcheprog può usare "ciao \ mondo" come previsto. Naturalmente, questo è un esempio semplificato di ciò che farò davvero.

+5

Qual è la natura della fuga? In altre parole, quali personaggi devono essere sfuggiti? Stai cercando una fuga in stile C++ (dove le schede sono sostituite da \ t, newline con \ n, quotazioni con \ ", ecc.)? È difficile aiutare senza che il problema sia ben definito. –

+2

possibile duplicato di [ echo che shell-fugge gli argomenti] (http://stackoverflow.com/questions/2731883/echo-that-shell-escapes-arguments) –

risposta

102

In Bash:

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

ad esempio:

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

Questo potrebbe essere utilizzato attraverso variabili troppo:

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

Attenzione, '% q' è stato rotto per più di un decennio fino al 2012. Ha avuto problemi con' ~ '. Esistono anche sed one-liner portatili http://stackoverflow.com/a/20053121/1073695 –

+1

sed è davvero meglio perché possono sfuggire anche i segni del dollaro – untore

+1

@untore: 'a = 'abc $ def":'; printf '% q \ n '"$ a" 'risulta in' abc \ $ def \ ":' (il simbolo del dollaro è sfuggito). Questo è Bash 4.3 (ho ottenuto lo stesso risultato in Bash 3.2). Che versione stai usando? –

1

È possibile utilizzare perl per sostituire vari personaggi, per esempio:

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

A seconda della natura della tua fuga, è possibile concatenare più chiamate a sfuggire ai caratteri corretti.

+1

Perché non sed? $ echo "ciao \ mondo" | sed 's/\\/\\\\ '' – Space

+1

@Octopus, anche questa è un'opzione valida.Mi capita di essere più a suo agio con perl, ma sì, anche questo funziona –

5

Pure parametro Bash, uso sostituzione:

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

Vuoi saperne di più? Http: //wiki.bash-hackers. org/syntax/pe # search_and_replace –

+1

in questo modo "ciao mondo" non è scappato a "ciao \ mondo" - l'errore di stampa nella risposta accettata lo fa. – vchrizz

+1

Inoltre, "% q" non scappa "/" come in "03/25/2017 "che dovevo scappare a" 03 \/25 \/2017 "(in modo che potesse trovarsi in un'espressione regolare delimitata da"/") – wrlee

Problemi correlati