2012-01-13 9 views
13

Un'applicazione sul computer deve leggere in un file di testo. Ne ho diversi e uno non funziona; il programma non riesce a leggerlo e mi dice che da qualche parte c'è un personaggio cattivo. La mia prima ipotesi è che ci sia un personaggio non-ascii da qualche parte, ma non ho idea di come trovarlo. Perl o qualsiasi regex generico sarebbe bello. Qualche idea?documento di ricerca per non-ascii

+0

Cosa hai provato finora? – nmagerko

+0

Credo che tu possa trovare una risposta [qui] (http://stackoverflow.com/questions/881931/how-can-i-find-extended-ascii-characters-in-a-file-using-perl)? – Neilos

+1

Ho accettato il caffè matematico perché era funzionante in modo superlativo in Notepad ++ –

risposta

12

È possibile utilizzare [^\x20-\x7E] per abbinare un carattere non ASCII.

ad es. grep -P '[^\x20-\x7E]' suspicious_file

+2

Ho avuto un problema nell'utilizzarlo, in quanto avrebbe identificato anche tutti i caratteri di fine riga nel mio file. Combinare la tua risposta con Ruakh ha funzionato come un fascino: [^ \ t \ n \ r \ x20- \ x7E] – JMM

+0

Nel mio caso, la [risposta dall'altra domanda] (http://stackoverflow.com/a/ 882437/873282) era meglio: '[\ xE0- \ xFF]' – koppor

4
perl -wne 'printf "byte %02X in line $.\n", ord $& while s/[^\t\n\x20-\x7E]//;' 

troveranno ogni personaggio che non è un ASCII glyphic carattere, scheda, spazio, o di nuova riga.

Se segnala 0D s (ritorni a capo) in file O.K., quindi cambiare \t\n in \t\n\r.

Se segnala solo i file 0D in cattivi, è probabile che sia possibile correggerli eseguendo dos2unix su di essi.

+0

Solo un addendum, si dovrebbe eseguire l'input come argomento finale non elencato. –

+0

Così, grazie! Ho dovuto cambiarlo leggermente per una console DOS: 'perl -wne" printf qq (byte% 02X nella riga $. \ N), ord $ e while s/[^ \ t \ n \ x20- \ x7E]//;" rplantiko

2

Se si utilizza tabulazioni nel codice sorgente così, provate questo modello:

[^\x08-\x7E] 

funziona anche in Notepad ++

Problemi correlati