2010-05-18 19 views
58

Necesito un comando bash que convierta una cadena en algo que se haya escapado. Aquí hay un ejemplo:Comando para escapar de una cadena en bash

 
echo "hello\world"|escape|someprog 

Donde el comando de escape hace "hello \ world" en "hello \\ world". Entonces, algún programa puede usar "hello \ world" como lo espera. Por supuesto, este es un ejemplo simplificado de lo que realmente haré.

+5

¿Cuál es la naturaleza del escape? En otras palabras, ¿qué personajes necesitan escaparse? ¿Está buscando un escape estilo C++ (donde las pestañas son reemplazadas por \ t, líneas nuevas con \ n, comillas con \ ", etc.)? Es difícil ayudar sin que el problema esté bien definido. –

+2

posible duplicado de [ echo que argumentos de shell-escapes] (http://stackoverflow.com/questions/2731883/echo-that-shell-escapes-arguments) –

Respuesta

102

En Bash:

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

por ejemplo:

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

Esto podría ser utilizado a través de variables también:

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

Eso sí, '% q' se rompió durante más de una década hasta alrededor de 2012. Tuvo problemas con' ~ '. También hay líneas sed sedimentadas http://stackoverflow.com/a/20053121/1073695 –

+1

sed es de hecho mejor porque también pueden escapar los signos de dólar – untore

+1

@untore: 'a = 'abc $ def":'; printf '% q \ n '"$ a" 'da como resultado' abc \ $ def \ ":' (el signo de dólar está escapado). Esto es Bash 4.3 (obtuve el mismo resultado en Bash 3.2). Qué versión estás usando? –

1

Puede utilizar Perl para reemplazar a varios personajes, por ejemplo:

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

Dependiendo de la naturaleza de su escape, puede múltiples cadena de llamadas para escapar de los caracteres adecuados.

+1

¿Por qué no sed? $ echo "hello \ world" | sed/\\/\\\\/' – Space

+1

@Octopus, que también es una opción válida. Estoy más cómodo con Perl, pero sí, eso también funciona. –

5

puro parámetro Bash, el uso substitución:

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

¿Quieres saber más? Http: //wiki.bash-hackers. org/syntax/pe # search_and_replace –

+1

de esta manera "hello world" no se escapa a "hello \ world" - printf aproach en la respuesta aceptada lo hace. – vchrizz

+1

Además, "% q" no escapa "/" como en "03/25/2017 "que necesitaba que se escapara a" 03 \/25 \/2017 "(para que pueda estar en una expresión regular delimitada '/'). – wrlee

Cuestiones relacionadas