Identificazione e rimozione di caratteri null in UNIX


98

Ho un file di testo contenente caratteri null indesiderati (ASCII NUL, \0). Quando provo a visualizzarlo in, vivedo ^@simboli, interlacciati nel testo normale. Come posso:

  1. Identificare quali righe nel file contengono caratteri nulli? Ho provato grepping per \0e \x0, ma non ha funzionato.

  2. Rimuovere i caratteri nulli? L'esecuzione stringsdel file lo ha ripulito, ma mi chiedo solo se questo sia il modo migliore?


1
Questo tipo di domanda probabilmente appartiene a SuperUser.com
Olivier Lalonde

2
In effetti, questa domanda è su superuser.com: superuser.com/questions/75130/how-to-remove-ths-symbol-with-vim
jrb

Risposte:


130

Userei tr:

tr < file-with-nulls -d '\000' > file-without-nulls

Se ti stai chiedendo se il reindirizzamento dell'input nel mezzo degli argomenti del comando funziona, lo fa. La maggior parte delle conchiglie riconosceranno e trattare con redirezione I / O ( <, >, ...) in qualsiasi punto della riga di comando, in realtà.


e un "diff file-with-nulls file-without-nulls" dovrebbe mostrarmi quali righe avevano caratteri null? Riporta molto di più del previsto.
dogbane

10
In realtà, credo che dovrebbe essere tr -d '\000' < file-with-nulls > file-without-nullspoiché <fa parte della funzionalità dello shell pipe e non tr.
Mikael S

9
La maggior parte delle shell riconoscerà e gestirà <o> ovunque nella stringa dell'argomento, in realtà. Sorpreso anche me.
pra

1
+1 Per l'utilizzo del reindirizzamento dell'input invece di cat |. Una buona soluzione pulita e ha risolto il mio problema.
Krzysztof Jabłoński

4
@Pointy '\ 000' viene utilizzato al posto di '\ 0' nella specifica POSIX opengroup per tr. Questo è un buon motivo per preferirlo
Harold Fischer

67

Utilizzare il seguente comando sed per rimuovere i caratteri null in un file.

sed -i 's/\x0//g' null.txt

questa soluzione modifica il file in posizione, importante se il file è ancora in uso. passando -i'ext 'crea un backup del file originale con l'aggiunta del suffisso' ext '.


6
Nota: in FreeBSD (e credo anche in Mac OS X), sed -i richiede un'estensione nell'argomento successivo, ma potrebbe essere vuoto. In questi sistemi, aggiungere una '', come in: sed -i '' 's/\x0//g "$FILE".
Tim Čas dal

1
Questo è un ordine di grandezza più veloce di trme
diachedelico

Per me, usando Git per Windows e $ sed --version-> sed (GNU sed) 4.7, ho dovuto usare la seguente invocazione per ottenere un file di backup chiamato example.csv.bak:sed -i.bak 's/\x0//g' example.csv
Andrew Keeton

1
@ TimČ come hai fatto alla grande, ne ho perso solo uno 'quindi dovrebbe essere sed -i' '' s / \ x0 // g 'some_file.xml
Darko

@Darko Così ho fatto. Ops.
Tim Čas

22

Un gran numero di caratteri NUL indesiderati, diciamo uno ogni due byte, indica che il file è codificato in UTF-16 e che dovresti usare iconvper convertirlo in UTF-8.


1
Ho esaurito lo spazio su disco durante la registrazione dell'applicazione. Ciò si traduce in questi personaggi.
dogbane

Per esempio, funziona con questo comando: iconv -f UTF-16 -t UTF-8 file.
djule5

7

Ho scoperto quanto segue, che stampa quali righe, se presenti, hanno caratteri nulli:

perl -ne '/\000/ and print;' file-with-nulls

Inoltre, un dump ottale può dirti se ci sono valori nulli:

od file-with-nulls | grep ' 000'

5

Se le righe nel file terminano con \ r \ n \ 000, ciò che funziona è eliminare \ n \ 000 quindi sostituire \ r con \ n.

tr -d '\n\000' <infile | tr '\r' '\n' >outfile

PS. Se ti trovi in ​​una shell DOS di Windows, puoi ottenere le versioni GNU / win32 dei comandi Unix da Sourceforge.net. Li uso sempre. Controlla "od" il comando ottale dump per analizzare cosa c'è in un file ...
wwmbes


1

Ero solito:

recode UTF-16..UTF-8 <filename>

per eliminare gli zeri nel file.


0

Ho riscontrato lo stesso errore con:

import codecs as cd
f=cd.open(filePath,'r','ISO-8859-1')

Ho risolto il problema cambiando la codifica in utf-16

f=cd.open(filePath,'r','utf-16')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.