2011-02-22 3 views

Répondre

8

Le builtin printf en bash a un spécificateur de format spécial (ie% b) qui convertit \ x * * à la valeur correspondante:

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

Ok, merci, voici mon script si vous voulez: http: //pastebin.com/jN862wFZ – Dorian

+1

J'ai fait quelques corrections mineures et j'ai écrit une version condensée ici: http://pastebin.com/y8KBgVA2 – marco

+0

Merci beaucoup, la version courte est difficile à maintenir pour moi, alors je garde le long un. – Dorian

1

Enfin, grâce à #bash canal IRC, je trouve une solution "pas si mal":

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

Je ne vois pas ce que l'écho qui vous entoure vous achète. Est-ce que 'echo string% 20with% 5Bsome% 23 | sed 's /%/\\\ x/g'' ne fonctionne pas? – Thanatos

+1

@Thanatos: La sed change simplement 'string% 20with% 5Bsome% 23' en' chaîne \ x20avec \ x5Bsome \ x23'. Passer à 'echo -e' signifiera que les échappements' \ x..' sont correctement traités. [Les '-e' manquants et les guillemets doivent être entourés de guillemets doubles:' echo -e "$ (echo string% 20avec% 5Bsome% 23 | sed 's /%/\\\ x/g')" '.] – bobbogo

+1

si vous voulez changer d'un fichier: 'echo \' sed 's /%/\\\ x/g' $ fichier \ '> $ newfile' – lolesque