Pipe caracteres hex para awk

3

Este comando funciona como esperado

$ awk 'BEGIN {print "\x41"}'
A

Como isso

$ printf '\x41' | awk '{print}'
A

No entanto, quando você confia no awk para reconhecer os caracteres hexadecimais, ele falha

$ echo '\x41' | awk '{print}'
\x41

Como isso pode ser superado?

    
por Steven Penny 01.05.2014 / 13:39

1 resposta

5

Você precisa fazer algo como:

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 não aceita uma string hexadecimal e a converte diretamente em um número, sem falar em um caractere.

Esse tipo de coisa é muito mais fácil em perl . Consulte aqui para obter uma awk de implementação de urldecode .

Como sugerido por @terdon , a implementação do GNU de awk tem uma opção -n|--non-decimal-data que permite que awk reconheça números hexadecimais e octal na entrada. Então você também pode fazer:

printf '%s\n' '\x41' | gawk -n '{printf "%c\n", +("0x" substr($0,3))}'

gawk também tem uma função strtonum() :

printf '%s\n' '\x41' | gawk -n '{printf "%c\n", strtonum("0x" substr($0,3))}'
    
por 01.05.2014 / 14:10

Tags