echo -n 5a | perl -pe 's/([0-9a-f]{2})/chr hex $1/gie'
Nota che questo non salterà i caratteri non esadecimali. Se vuoi solo l'esadecimale (senza spazi dalla stringa originale ecc.):
echo 5a | perl -ne 's/([0-9a-f]{2})/print chr hex $1/gie'
Inoltre, zsh
e bash
supporta questo in modo nativo in echo
:
echo -e '\x5a'
Puoi farlo con echo
solo, senza le altre cose. Non dimenticare di aggiungere "-n" o otterrai automaticamente un'interruzione di riga:
echo -n -e "\x5a"
Lo facevo con xxd:
echo -n 5a | xxd -r -p
Ma poi mi sono reso conto che in Debian/Ubuntu, xxd fa parte di vim-common e quindi potrebbe non essere presente in un sistema minimale. Per evitare anche Perl (anche IMHO non fa parte di un sistema minimo), ho finito per usare sed, xargs e printf in questo modo:
echo -n 5a | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf
Principalmente, voglio solo convertire pochi byte e va bene per tali attività. Il vantaggio di questa soluzione rispetto a quella di ghostdog74 è che può convertire automaticamente stringhe esadecimali di lunghezze arbitrarie. xargs è usato perché printf non legge dallo standard input.