/ / Intentar usar egrep para extraer solo caracteres hexadecimales coincidentes de una base de datos - bash, sed, pcre, grep

Intentar usar egrep para extraer solo caracteres hexadecimales coincidentes de una base de datos: bash, sed, pcre, grep

Los caracteres hexadecimales están en forma de <9F>. Hay muchos datos a su alrededor, pero solo estoy interesado en obtener la expresión regular correcta para poder eliminarlos de una tabla con sed y luego volver a importar la base de datos.

Esto es lo que he intentado hasta ahora:

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

Y varias variaciones. Parece que no puedo hacerlo funcionar, y no estoy seguro de por qué. También he intentado el doble / triple de escape y agrupación. Encuentra el par de caracteres, pero no encuentra el < >"s

Entonces da salida así:

39
48
69
6F
B9

pero lo necesito para obtener la plena

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

Respuestas

1 para la respuesta № 1

Estoy apostando a que estos son bytes fuera del rango que su terminal puede mostrar (ya sea con caracteres de control o cadenas multibyte).

Primero tengo que preguntarte si estás absolutamente seguro.que desea eliminar esto de la base de datos (después de todo, alguien podría haber querido un registro para insertar un registro con la palabra "über" o algo así). También, he visto que algunas bases de datos usan caracteres de control como separadores en archivos de volcado de base de datos también (Ingres viene a la mente)

Si aún desea borrar los datos, intente esto:

perl -npe "tr /

Estoy escribiendo esto en una tableta, así que no puedo volver a verificar, pero eso debería eliminar cualquier carácter fuera del rango ASCII de 7 bits.


0 para la respuesta № 2

Esto funciona para mí:

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

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

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

0 para la respuesta № 3

Escapar de los signos menor y mayor que hace que la coincidencia busque el principio de la palabra y el final de los límites de la palabra. Si quieres hacer coincidir esos caracteres literales, úsalos sin escapar.

Además, puede simplificar su expresión regular utilizando una clase de caracteres.

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

Es posible que tenga otros caracteres que no se impriman que no estén combinados. Como Adam sugirió, use od o hexdump Para ver qué más se puede esconder. Los archivos binarios a veces se representan para la salida utilizando, por ejemplo, <EF> sin que esos personajes estén realmente allí. Qué es habría un byte que tiene el valor 0xEF. Datos binarios como ese no funcionarán bien con sed o grep.