Como converter caracteres hex para chars normais?

4

Eu tentei, mas estou preso em "escapar" do "sed's":

sed -i 's/\x0/NUL/g' $1
sed -i 's/\x1/SOH/g' $1
sed -i 's/\x2/STX/g' $1
sed -i 's/\x3/ETX/g' $1
sed -i 's/\x4/EOT/g' $1
sed -i 's/\x5/ENQ/g' $1
sed -i 's/\x6/ACK/g' $1
sed -i 's/\x7/BEL/g' $1
sed -i 's/\x8/BS/g' $1
sed -i 's/\x9/HT/g' $1
sed -i 's/\x0A/LF/g' $1
sed -i 's/\x0B/VT/g' $1
sed -i 's/\x0C/FF/g' $1
sed -i 's/\x0D/CR/g' $1
sed -i 's/\x0E/SO/g' $1
sed -i 's/\x0F/SI/g' $1
sed -i 's/\x10/DLE/g' $1
sed -i 's/\x11/DC1/g' $1
sed -i 's/\x12/DC2/g' $1
sed -i 's/\x13/DC3/g' $1
sed -i 's/\x14/DC4/g' $1
sed -i 's/\x15/NAK/g' $1
sed -i 's/\x16/SYN/g' $1
sed -i 's/\x17/ETB/g' $1
sed -i 's/\x18/CAN/g' $1
sed -i 's/\x19/EM/g' $1
sed -i 's/\x1A/SUB/g' $1
sed -i 's/\x1B/ESC/g' $1
sed -i 's/\x1C/FS/g' $1
sed -i 's/\x1D/GS/g' $1
sed -i 's/\x1E/RS/g' $1
sed -i 's/\x1F/US/g' $1
sed -i 's/\x20//g' $1
sed -i 's/\x21/!/g' $1
sed -i 's/\x22/"/g' $1
sed -i 's/\x23/#/g' $1
sed -i 's/\x24/$/g' $1
sed -i 's/\x25/%/g' $1
sed -i 's/\x26/&/g' $1
sed -i 's/\x27'/g' $1
sed -i 's/\x28/(/g' $1
sed -i 's/\x29/)/g' $1
sed -i 's/\x2A/*/g' $1
sed -i 's/\x2B/0/g' $1
sed -i 's/\x2C/,/g' $1
sed -i 's/\x2D/0/g' $1
sed -i 's/\x2E/0/g' $1
sed -i 's/\x2F///g' $1
sed -i 's/\x30/0/g' $1
sed -i 's/\x31/1/g' $1
sed -i 's/\x32/2/g' $1
sed -i 's/\x33/3/g' $1
sed -i 's/\x34/4/g' $1
sed -i 's/\x35/5/g' $1
sed -i 's/\x36/6/g' $1
sed -i 's/\x37/7/g' $1
sed -i 's/\x38/8/g' $1
sed -i 's/\x39/9/g' $1
sed -i 's/\x3A/:/g' $1
sed -i 's/\x3B/;/g' $1
sed -i 's/\x3C/</g' $1
sed -i 's/\x3D/=/g' $1
sed -i 's/\x3E/>/g' $1
sed -i 's/\x3F/?/g' $1
sed -i 's/\x40/@/g' $1
sed -i 's/\x41/A/g' $1
sed -i 's/\x42/B/g' $1
sed -i 's/\x43/C/g' $1
sed -i 's/\x44/D/g' $1
sed -i 's/\x45/E/g' $1
sed -i 's/\x46/F/g' $1
sed -i 's/\x47/G/g' $1
sed -i 's/\x48/H/g' $1
sed -i 's/\x49/I/g' $1
sed -i 's/\x4A/J/g' $1
sed -i 's/\x4B/K/g' $1
sed -i 's/\x4C/L/g' $1
sed -i 's/\x4D/M/g' $1
sed -i 's/\x4E/N/g' $1
sed -i 's/\x4F/O/g' $1
sed -i 's/\x50/P/g' $1
sed -i 's/\x51/Q/g' $1
sed -i 's/\x52/R/g' $1
sed -i 's/\x53/S/g' $1
sed -i 's/\x54/T/g' $1
sed -i 's/\x55/U/g' $1
sed -i 's/\x56/V/g' $1
sed -i 's/\x57/W/g' $1
sed -i 's/\x58/X/g' $1
sed -i 's/\x59/Y/g' $1
sed -i 's/\x5A/Z/g' $1
sed -i 's/\x5B/[/g' $1
sed -i 's/\x5C/\/g' $1
sed -i 's/\x5D/]/g' $1
sed -i 's/\x5E/^/g' $1
sed -i 's/\x5F/_/g' $1
sed -i 's/\x60/'/g' $1
sed -i 's/\x61/a/g' $1
sed -i 's/\x62/b/g' $1
sed -i 's/\x63/c/g' $1
sed -i 's/\x64/d/g' $1
sed -i 's/\x65/e/g' $1
sed -i 's/\x66/f/g' $1
sed -i 's/\x67/g/g' $1
sed -i 's/\x68/h/g' $1
sed -i 's/\x69/i/g' $1
sed -i 's/\x6A/j/g' $1
sed -i 's/\x6B/k/g' $1
sed -i 's/\x6C/l/g' $1
sed -i 's/\x6D/m/g' $1
sed -i 's/\x6E/n/g' $1
sed -i 's/\x6F/o/g' $1
sed -i 's/\x70/p/g' $1
sed -i 's/\x71/q/g' $1
sed -i 's/\x72/r/g' $1
sed -i 's/\x73/s/g' $1
sed -i 's/\x74/t/g' $1
sed -i 's/\x75/u/g' $1
sed -i 's/\x76/v/g' $1
sed -i 's/\x77/w/g' $1
sed -i 's/\x78/x/g' $1
sed -i 's/\x79/y/g' $1
sed -i 's/\x7A/z/g' $1
sed -i 's/\x7B/{/g' $1
sed -i 's/\x7C/|/g' $1
sed -i 's/\x7D/}/g' $1
sed -i 's/\x7E/~/g' $1
sed -i 's/\x7F//g' $1
sed -i 's/\x80/€/g' $1
sed -i 's/\x81//g' $1
sed -i 's/\x82/‚/g' $1
sed -i 's/\x83/ƒ/g' $1
sed -i 's/\x84/„/g' $1
sed -i 's/\x85/…/g' $1
sed -i 's/\x86/†/g' $1
sed -i 's/\x87/‡/g' $1
sed -i 's/\x88/ˆ/g' $1
sed -i 's/\x89/‰/g' $1
sed -i 's/\x8A/Š/g' $1
sed -i 's/\x8B/‹/g' $1
sed -i 's/\x8C/Œ/g' $1
sed -i 's/\x8D//g' $1
sed -i 's/\x8E/Ž/g' $1
sed -i 's/\x8F//g' $1
sed -i 's/\x90//g' $1
sed -i 's/\x91/‘/g' $1
sed -i 's/\x92/’/g' $1
sed -i 's/\x93/“/g' $1
sed -i 's/\x94/”/g' $1
sed -i 's/\x95/•/g' $1
sed -i 's/\x96/–/g' $1
sed -i 's/\x97/—/g' $1
sed -i 's/\x98/˜/g' $1
sed -i 's/\x99/™/g' $1
sed -i 's/\x9A/š/g' $1
sed -i 's/\x9B/›/g' $1
sed -i 's/\x9C/œ/g' $1
sed -i 's/\x9D//g' $1
sed -i 's/\x9E/ž/g' $1
sed -i 's/\x9F/Ÿ/g' $1
sed -i 's/\xA0//g' $1
sed -i 's/\xA1/¡/g' $1
sed -i 's/\xA2/¢/g' $1
sed -i 's/\xA3/£/g' $1
sed -i 's/\xA4/¤/g' $1
sed -i 's/\xA5/¥/g' $1
sed -i 's/\xA6/¦/g' $1
sed -i 's/\xA7/§/g' $1
sed -i 's/\xA8/¨/g' $1
sed -i 's/\xA9/©/g' $1
sed -i 's/\xAA/ª/g' $1
sed -i 's/\xAB/«/g' $1
sed -i 's/\xAC/¬/g' $1
sed -i 's/\xAD//g' $1
sed -i 's/\xAE/®/g' $1
sed -i 's/\xAF/¯/g' $1
sed -i 's/\xB0/°/g' $1
sed -i 's/\xB1/±/g' $1
sed -i 's/\xB2/²/g' $1
sed -i 's/\xB3/³/g' $1
sed -i 's/\xB4/´/g' $1
sed -i 's/\xB5/µ/g' $1
sed -i 's/\xB6/¶/g' $1
sed -i 's/\xB7/·/g' $1
sed -i 's/\xB8/¸/g' $1
sed -i 's/\xB9/¹/g' $1
sed -i 's/\xBA/º/g' $1
sed -i 's/\xBB/»/g' $1
sed -i 's/\xBC/¼/g' $1
sed -i 's/\xBD/½/g' $1
sed -i 's/\xBE/¾/g' $1
sed -i 's/\xBF/¿/g' $1
sed -i 's/\xC0/À/g' $1
sed -i 's/\xC1/A/g' $1
sed -i 's/\xC2/Â/g' $1
sed -i 's/\xC3/Ã/g' $1
sed -i 's/\xC4/Ä/g' $1
sed -i 's/\xC5/Å/g' $1
sed -i 's/\xC6/Æ/g' $1
sed -i 's/\xC7/Ç/g' $1
sed -i 's/\xC8/È/g' $1
sed -i 's/\xC9/E/g' $1
sed -i 's/\xCA/Ê/g' $1
sed -i 's/\xCB/Ë/g' $1
sed -i 's/\xCC/Ì/g' $1
sed -i 's/\xCD/I/g' $1
sed -i 's/\xCE/Î/g' $1
sed -i 's/\xCF/Ï/g' $1
sed -i 's/\xD0/Ð/g' $1
sed -i 's/\xD1/Ñ/g' $1
sed -i 's/\xD2/Ò/g' $1
sed -i 's/\xD3/O/g' $1
sed -i 's/\xD4/Ô/g' $1
sed -i 's/\xD5/Õ/g' $1
sed -i 's/\xD6/O/g' $1
sed -i 's/\xD7/×/g' $1
sed -i 's/\xD8/Ø/g' $1
sed -i 's/\xD9/Ù/g' $1
sed -i 's/\xDA/U/g' $1
sed -i 's/\xDB/Û/g' $1
sed -i 's/\xDC/U/g' $1
sed -i 's/\xDD/Ý/g' $1
sed -i 's/\xDE/Þ/g' $1
sed -i 's/\xDF/ß/g' $1
sed -i 's/\xE0/à/g' $1
sed -i 's/\xE1/a/g' $1
sed -i 's/\xE2/â/g' $1
sed -i 's/\xE3/ã/g' $1
sed -i 's/\xE4/ä/g' $1
sed -i 's/\xE5/å/g' $1
sed -i 's/\xE6/æ/g' $1
sed -i 's/\xE7/ç/g' $1
sed -i 's/\xE8/è/g' $1
sed -i 's/\xE9/e/g' $1
sed -i 's/\xEA/ê/g' $1
sed -i 's/\xEB/ë/g' $1
sed -i 's/\xEC/ì/g' $1
sed -i 's/\xED/i/g' $1
sed -i 's/\xEE/î/g' $1
sed -i 's/\xEF/ï/g' $1
sed -i 's/\xF0/ð/g' $1
sed -i 's/\xF1/ñ/g' $1
sed -i 's/\xF2/ò/g' $1
sed -i 's/\xF3/o/g' $1
sed -i 's/\xF4/ô/g' $1
sed -i 's/\xF5/õ/g' $1
sed -i 's/\xF6/o/g' $1
sed -i 's/\xF7/÷/g' $1
sed -i 's/\xF8/ø/g' $1
sed -i 's/\xF9/ù/g' $1
sed -i 's/\xFA/u/g' $1
sed -i 's/\xFB/û/g' $1
sed -i 's/\xFC/u/g' $1
sed -i 's/\xFD/ý/g' $1
sed -i 's/\xFE/þ/g' $1
sed -i 's/\xFF/\ÿ/g' $1

Como posso criar um conversor de caracteres normal para o código hexadecimal? Então, se eu correr:

sh thementionedscript.sh hexstrings.txt

- > > Todos os caracteres HEX em hexstrings.txt devem ser convertidos em caracteres normais, como: before:

\x68\x69

depois:

hi
    
por LanceBaynes 22.10.2011 / 22:14

4 respostas

4

Em bash :

#!/bin/bash

while IFS= read -r line; do
    printf "$line"
done

IFS= é necessário para impedir a ocorrência de stripping do IFS, ou seja, na maioria dos casos (onde o IFS contém whitespace, que é a norma) se você não fizer o IFS vazio, os espaços em branco serão removidos de cada lado de "${line}" , independentemente do fato de você ter citado. A opção -r para ler pára a interpretação do backspace.

Tenha em mente que isso também interpretará outros códigos de escape que podem estar presentes em sua fonte. Se isso lhe diz respeito, leia o arquivo caractere por caractere e só tenha printf em \ x códigos de escape.

Você deve sempre usar um arquivo temporário, então execute-o assim:

./foo < myfile > mytempfile && mv mytempfile myfile

Além disso, não use sed -i para editar arquivos, não é portátil e até mesmo onde é a sintaxe varia entre implementações (seu código falhará no Mac OSX e na maioria dos BSDs, por exemplo). ed é a melhor opção para editar arquivos.

    
por 22.10.2011 / 22:20
2

No bash?

#!/bin/bash

while IFS= read line
 do
 echo -e "$line"
done
    
por 22.10.2011 / 22:18
1

Aqui está uma nova abordagem sobre a questão ...

Para usar sed para fazer as alterações, você está 97% do caminho até lá.
Aqui estão alguns pontos essenciais e alguns opcionais para fazê-lo funcionar.

  • Pode ser útil fazer com que todos os seus padrões sejam insensíveis. Use ig em vez de g

  • Você pode fazer todas as substituições em uma única passagem. Basta concatená-los, por exemplo. 's/\x00/NUL/ig;s/\x01/SOH/ig;s/\x02/STX/ig;...' ,
    ou 's/\x01/SOH/ig; 
      s/\x02/STX/ig; 
      ... 
      s/\xFE/þ/ig; 
      s/\xFF/ÿ/ig;'

  • Você precisa alterar algumas das expressões de substituição:% /'/ deve ser /\x27/ Ele entra em conflito com as citações ' em 's / a / b / ig'
    /\/ deve ser /\/ Caso contrário, ela escapa de / e /&/ deve ser /\&/ Como por si só, é uma referência anterior

  • Você precisa trocar o delimitador / quando / ocorrerem na sua expressão substituta. Apenas para essa expressão, altere-a para | (ou o que for necessário), por exemplo. s|\x2F|/|g; Algumas situações de sed requerem que seja escapado no início de um padrão, por exemplo. uma expressão de intervalo. '\|^abc|q'

  • Eu notei algumas diferenças na sua lista em comparação com o que eu criei (com base na codificação do Windows-1252). Você pode querer verificar estes: 7F ('DEL') A0 ('') AD ('SHY')

  • Encontro relatórios variados sobre a maneira como sed -i lida com as chamadas atualizações insitu. Ele usa um arquivo temporário em qualquer caso, então eu me inclino a usar sponge (package moreutils ) para reescrever o arquivo de texto.

É sobre isso. Aqui está um exemplo do comando sed resultante ...

 sed -e '
 s/\x01/SOH/ig;
 s/\x02/STX/ig;
 ...
 s/\xFE/þ/ig;
 s/\xFF/ÿ/ig;
 ' "$1" | sponge "$1"

O comando completo pode ser encontrado em paste.ubuntu

    
por 23.10.2011 / 20:58
0

UPDATE Se você quiser interpretar os valores hexadecimais como Windows-1252 e representá-los na codificação de sua localidade atual (geralmente UTF-8 para * nix), você pode usar o seguinte comando. Nota. Para além das novas linhas (\ n) para cada linha de entrada, este fragmento toma como entrada apenas dados no formulário \x33\x66\x99\xBB\xFF ... qualquer outra coisa causa um erro.

<file sed -re 's|(.)\x|,0x|g; s|^\x|0x|; $!{s|$|,0x0a|}' |
 tr '\n' ',' | recode Windows-1252/x1..UTF-8 

A partir daqui, é a minha resposta original (que não considera diferentes codificações)

Você pode usar xxd no modo reverter (-r) postscript (-p). xxd faz parte do pacote vi .
Nota. Os dados de teste contêm caracteres hexadecimais \ n (\ x0a). xxd ignora qualquer caractere \ n real, portanto, você divide os dados hexadecimais em quantas linhas desejar (como no arquivo de teste).

xxd também é útil para converter um hexdump direto, por exemplo. 68656c6c6f20776f726c64 (hello world) ... sed é usado neste exemplo apenas para remover o '\ x'.

Este primeiro snippet ignora caracteres que não estão no formato \ xXX ...

<file sed -e 's|\x||g' | xxd -p -r

Se você quiser manter as novas linhas (\ n vs \ x0a) do arquivo souce, use isto (outro texto é ignorado)

<file sed -e 's|\x||g; s|$|0a|' | xxd -p -r

crie um arquivo de teste

echo -n "
\x63\x61\x74\x0a\x64\x6f\x67\x0a\x62\x69\x72\x64\x0a\x6d\x6f\x6f
\x73\x65\x0a\x61\x6c\x62\x61\x74\x72\x6f\x73\x73" >file

saída (do primeiro snippet, que age apenas nos dados \ xXX)

cat
dog
bird
moose
albatross
    
por 22.10.2011 / 23:35