2011-02-22 17 views

Respuesta

8

El printf incorporado en bash tiene un formato especial especificador (es decir,% b) que convierte \ x * * al valor correspondiente:

$ str='foo%20%5B12%5D' 
$ printf "%b\n" "${str//%/\\x}" 
foo [12] 
+1

Bien, gracias, aquí está mi script si lo desea: http: //pastebin.com/jN862wFZ – Dorian

+1

He hecho algunas correcciones menores y he escrito una versión condensada aquí: http://pastebin.com/y8KBgVA2 – marco

+0

Muchas gracias, la versión corta es difícil de mantener para mí, así que guardo el largo uno. – Dorian

1

Por último, gracias a #bash canal de IRC, he encontrado una "no tan malo" solución:

echo `echo string%20with%5Bsome%23 | sed 's/%/\\\x/g'` 
+0

No veo lo que el eco circundante le compra. ¿'Echo string% 20with% 5Bsome% 23 | sed 's /%/\\\ x/g'' no funciona? – Thanatos

+1

@Thanatos: The sed simplemente cambia 'string% 20with% 5Bsome% 23' en' string \ x20with \ x5Bsome \ x23'. Pasar esto a 'echo -e' significará que los escapes' \ x..' se procesan correctamente. [Falta '-e' y los backticks deben estar envueltos entre comillas dobles:' echo -e "$ (echo string% 20with% 5Bsome% 23 | sed 's /%/\\\ x/g')" '.] – bobbogo

+1

si desea cambiar de un archivo: 'echo \' sed 's /%/\\\ x/g' $ archivo \ '> $ newfile' – lolesque

Cuestiones relacionadas