/ / Tentando usar o egrep para extrair apenas caracteres hexadecimais correspondentes de um banco de dados - bash, sed, pcre, grep

Tentando usar o egrep para extrair apenas caracteres hexadecimais correspondentes de um banco de dados - bash, sed, pcre, grep

Os caracteres hexadecimais estão na forma de <9F>. Existem muitos dados em torno deles, mas estou interessado apenas em obter a regex correta, para que eu possa removê-los de uma tabela com sed e reimporte o banco de dados.

Aqui está o que eu tentei até agora:

egrep -io "<[0-9A-Fa-f]{2}>" /root/database.sql

E várias variações. Parece que não consigo fazê-lo funcionar, e não sei por que. Eu tentei escapar / agrupar duplos / triplos também. Ele encontra o par de caracteres, mas não encontra o < >"s

Portanto, fornece resultados como este:

39
48
69
6F
B9

mas eu preciso disso para obter o máximo

<39>
<48>
<69>
<6F>
<B9>

Respostas:

1 para resposta № 1

Aposto que são bytes fora do intervalo que o terminal pode exibir (caracteres de controle ou seqüências de vários bytes).

Primeiro eu tenho que perguntar se você está absolutamente certoque você deseja limpar isso da base de dados (afinal alguém pode querer reunir um registro com a palavra "über" ou algo assim). Além disso, também vi alguns bancos de dados usar caracteres de controle como separadores em arquivos de despejo de banco de dados (Ingres vem à mente)

Se você ainda deseja limpar os dados, talvez tente o seguinte:

perl -npe "tr /

Estou digitando isso em um tablet para não poder verificar novamente, mas isso deve excluir os caracteres fora do intervalo ASCII de 7 bits.


0 para resposta № 2

Isso funciona para mim:

$cat testfile
<39> <48>
<60><6F><a4>

$egrep -io "<[0-9A-Fa-f]{2}>" testfile

<39>
<48>
<60>
<6F>
<a4>

0 para resposta № 3

Escapar dos sinais menor que e maior que faz com que a correspondência procure o início dos limites da palavra e o fim da palavra. Se você deseja combinar esses caracteres literais, use-os sem escape.

Além disso, você pode simplificar sua regex usando uma classe de caracteres.

grep -E "<[[:xdigit:]]{2}>"

É possível que você tenha outros caracteres não imprimíveis que não estão sendo correspondidos. Como Adam sugeriu, use od ou hexdump para ver o que mais pode estar escondido. Às vezes, os arquivos binários são representados para saída usando, por exemplo, <EF> sem esses personagens realmente estarem lá. o que é haveria um byte com o valor 0xEF. Dados binários como esse não funcionarão bem com sed ou grep.