echo -n 5a | perl -pe 's/([0-9a-f]{2})/chr hex $1/gie'
Tenga en cuenta que esto no omitirá los caracteres no hexadecimales. Si desea solo el hexadecimal (sin espacios en blanco de la cadena original, etc.):
echo 5a | perl -ne 's/([0-9a-f]{2})/print chr hex $1/gie'
Además, zsh
y bash
admite esto de forma nativa en echo
:
echo -e '\x5a'
Puedes hacer esto con echo
solamente, sin las otras cosas. No olvide agregar "-n" o obtendrá un salto de línea automáticamente:
echo -n -e "\x5a"
Solía hacer esto con xxd:
echo -n 5a | xxd -r -p
Pero luego me di cuenta de que en Debian/Ubuntu, xxd es parte de vim-common y, por lo tanto, podría no estar presente en un sistema mínimo. Para evitar también Perl (en mi humilde opinión, tampoco es parte de un sistema mínimo), terminé usando sed, xargs e printf así:
echo -n 5a | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf
Principalmente, solo quiero convertir unos pocos bytes y está bien para tales tareas. La ventaja de esta solución sobre la de ghostdog74 es que puede convertir cadenas hexadecimales de longitudes arbitrarias automáticamente. xargs se usa porque printf no lee desde la entrada estándar.