Un'altra soluzione in sed
, ma utilizzando meno memoria:
xxd -c1 -p file |
sed -n -e '1{N;N;N}' -e '/ff\nd8\nff\nd0/{:begin;p;s/.*//;n;bbegin}' -e 'N;D' |
sed -n -e '1{N;N}' -e '/aa\nff\nd9/{p;Q1}' -e 'P;N;D' |
xxd -r -p > new_file
test ${PIPESTATUS[2]} -eq 1 || rm new_file
Il 1 ° sed
stampa da ff d8 ff d0
fino alla fine del file. Si noti che è necessario il numero N
in -e '1{N;N;N}'
in quanto vi sono byte nel 1o modello meno uno.
Il 2 ° sed
stampa dall'inizio del file su aa ff d9
. Nota ancora che hai bisogno di più N
in -e '1{N;N}'
dato che ci sono byte nel tuo secondo modello meno uno.
Ancora una volta, è necessario un test per verificare se il 2 ° modello è stato trovato ed eliminare il file se non lo è.
Si noti che il comando Q
è un'estensione GNU su sed
. Se non ce l'hai, devi cestinare il resto del file una volta che il modello è stato trovato (in un ciclo come il 1o sed
, ma non stampare il file), e controlla dopo la conversione esadecimale in binario che il nuovo file finisce con modello di wright.
Ancora un altro riassegnazione del marchio - la soluzione di lOranger fallisce se il 2 ° modello può essere trovato prima del 1 ° - dando $ len con segno negativo. Questa soluzione ricerca dopo la prima corrispondenza del modello, quindi non presenta tale problema né genera file di dimensioni triple intermedie. – theta
Dopo aver testato di più, l'ho trovato senza problemi, ma è piuttosto lento su file di grandi dimensioni. Qualcuno vede un posto per qualche ottimizzazione, o questo è il migliore che si possa ottenere da xxd/awk? – theta
Prova la nuova versione 'sed' che ho appena postato. Questo può essere ottimizzato sostituendo la concatenazione delle stringhe e l'estrazione con gli indici rotanti negli array, ma è meno leggibile; e non voglio farlo se non necessario ;-). – jfg956