/ / Cercare di usare egrep per estrarre solo i caratteri esadecimali corrispondenti da un database - bash, sed, pcre, grep

Cercando di usare egrep per estrarre solo caratteri esadecimali abbinati da un database - bash, sed, pcre, grep

I caratteri esadecimali sono in forma di <9F>. Ci sono molti dati intorno a loro, ma mi interessa solo ottenere il regex giusto, quindi posso rimuoverli da una tabella con sed e quindi reimportare il database.

Ecco cosa ho provato fino ad ora:

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

E diverse varianti. Non riesco a farlo funzionare, e non sono sicuro del perché. Ho provato anche il doppio / triplo escape e il raggruppamento. Trova la coppia di caratteri, ma non trova il < >"S

Quindi fornisce un output come questo:

39
48
69
6F
B9

ma ne ho bisogno per ottenere il massimo

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

risposte:

1 per risposta № 1

Scommetto che si tratta di byte al di fuori dell'intervallo che il terminale può visualizzare (caratteri di controllo o stringhe multibyte).

Per prima cosa devo chiederti se sei assolutamente certoche si desidera eliminare completamente dai dati (dopo che qualcuno potrebbe aver voluto un rally inserire un record con la parola "über" o qualcosa del genere). Inoltre, ho visto alcuni database usare i caratteri di controllo come separatori nei file di dump DB (mi viene in mente Ingres)

Se vuoi ancora cancellare i dati, prova forse questo:

perl -npe "tr /

Sto scrivendo questo su un tablet, quindi non posso ricontrollare, ma ciò dovrebbe eliminare qualsiasi carattere al di fuori dell'intervallo ASCII a 7 bit.


0 per risposta № 2

Questo funziona per me:

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

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

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

0 per risposta № 3

L'escape dei segni minore di e maggiore di fa sì che la corrispondenza cerchi l'inizio della parola e la fine dei confini della parola. Se vuoi abbinare quei caratteri letterali, usali senza caratteri di escape.

Inoltre, puoi semplificare la tua regex usando una classe di caratteri.

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

È possibile che tu abbia altri caratteri non stampabili che non vengono abbinati. Come ha suggerito Adam, usa od o hexdump per vedere cos'altro potrebbe nascondersi. I file binari sono talvolta rappresentati per l'output utilizzando, ad esempio, <EF> senza che quei personaggi fossero effettivamente lì. Che cosa è ci sarebbe un byte con il valore 0xEF. Dati binari del genere non funzioneranno bene con sed o grep.