echo -n 5a | perl -pe 's/([0-9a-f]{2})/chr hex $1/gie'
Všimněte si, že to nepřeskočí nehexadecimální znaky. Pokud chcete pouze hex (žádné mezery z původního řetězce atd.):
echo 5a | perl -ne 's/([0-9a-f]{2})/print chr hex $1/gie'
Také zsh
a bash
podporujte to nativně v echo
:
echo -e '\x5a'
Můžete to udělat pomocí echo
pouze bez ostatních věcí. Nezapomeňte přidat "-n", jinak se automaticky zobrazí zalomení řádku:
echo -n -e "\x5a"
Kdysi jsem to dělal s xxd:
echo -n 5a | xxd -r -p
Ale pak jsem si uvědomil, že v Debianu/Ubuntu je xxd součástí vim-common, a proto nemusí být přítomen v minimálním systému. Abych se také vyhnul Perlu (IMHO také není součástí minimálního systému), nakonec jsem použil sed, xargs a printf takto:
echo -n 5a | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf
Většinou chci převést jen pár bajtů a pro takové úkoly je to v pořádku. Výhodou tohoto řešení oproti řešení ghostdog74 je, že dokáže automaticky převádět hex struny libovolných délek. xargs se používá, protože printf nečte ze standardního vstupu.