コマンドは期待どおりに機能します。
$ awk 'BEGIN {print "\x41"}'
A
ただこんな感じ
$ printf '\x41' | awk '{print}'
A
ただし、awkを使用して16進文字を認識すると失敗します。
$ echo '\x41' | awk '{print}'
\x41
この問題を克服する方法は?
答え1
次の作業を行う必要があります。
printf '%s\n' '\x41' |
awk 'BEGIN{for (i=0;i<0x100;i++) x[sprintf("%02x",i)]=sprintf("%c",i)}
{print x[tolower(substr($0,3))]}'
awk
16進文字列を文字だけでなく数値に直接変換する方法もありません。
このようなことは、で行うのははるかに簡単ですperl
。バラよりここawk
実装urldecode
。
〜のように@terdon ヒント、GNU実装には、入力された16進数と8進数を認識するオプションがawk
あります。したがって、次のようにすることもできます。-n|--non-decimal-data
awk
printf '%s\n' '\x41' | gawk -n '{printf "%c\n", +("0x" substr($0,3))}'
gawk
次の機能もありますstrtonum()
。
printf '%s\n' '\x41' | gawk -n '{printf "%c\n", strtonum("0x" substr($0,3))}'