function uri_unescape() { local b c i l b="" while read do i=0 l=${#REPLY} while (( ${i} < ${l} )) do c=${REPLY:${i}:1} case ${#b} in (0) case "${c}" in (+) echo -n " " ;; (%) b='\x' ;; (*) echo -n "${c}" ;; esac ;; (2) b="${b}${c}" ;; (3) b="${b}${c}" printf "%b" "${b}" b="" ;; (*) echo -n "${c}" b="" ;; esac i=$(( ${i} + 1 )) done done }