echo -n 5a | perl -pe 's/([0-9a-f]{2})/chr hex $1/gie'
これは非 16 進文字をスキップしないことに注意してください。 16 進数だけが必要な場合 (元の文字列の空白などは必要ありません):
echo 5a | perl -ne 's/([0-9a-f]{2})/print chr hex $1/gie'
また、zsh
と bash
echo
でこれをネイティブにサポート :
echo -e '\x5a'
echo
でこれを行うことができます のみ、他のものなし。 「-n」を追加することを忘れないでください。そうしないと、自動的に改行が行われます:
echo -n -e "\x5a"
以前は xxd でこれを行っていました:
echo -n 5a | xxd -r -p
しかし、Debian/Ubuntu では、xxd は vim-common の一部であるため、最小システムには存在しない可能性があることに気付きました。 Perl も避けるために (最小システムの一部でもありません)、sed、xargs、および printf を次のように使用することになりました。
echo -n 5a | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf
ほとんどの場合、変換したいのは数バイトだけで、そのようなタスクには問題ありません。 Ghostdog74 のソリューションに対するこのソリューションの利点は、任意の長さの 16 進文字列を自動的に変換できることです。 printf は標準入力から読み取らないため、xargs が使用されます。