2012-01-13 7 views
13

Una aplicación en mi computadora necesita leer en un archivo de texto. Tengo varios y uno no funciona; el programa no lo lee y me dice que hay un mal personaje en algún lado. Mi primera suposición es que hay un personaje no ascii en algún lado, pero no tengo idea de cómo encontrarlo. Perl o cualquier regex genérica sería agradable. ¿Algunas ideas?documento de búsqueda para no-ascii

+0

¿Qué te tratan tan lejos? – nmagerko

+0

Creo que puede encontrar una respuesta [aquí] (http://stackoverflow.com/questions/881931/how-can-i-find-extended-ascii-characters-in-a-file-using-perl)? – Neilos

+1

Acepté el café matemático porque funcionaba excesivamente en Notepad ++ –

Respuesta

12

Puede usar [^\x20-\x7E] para que coincida con un carácter que no sea ASCII.

p. Ej. grep -P '[^\x20-\x7E]' suspicious_file

+2

Tuve un problema al usar esto, ya que también identificaría todos los caracteres de final de línea en mi archivo. La combinación de tu respuesta con la de Ruakh funcionó a las mil maravillas: [^ \ t \ n \ r \ x20- \ x7E] – JMM

+0

En mi caso, la [respuesta de la otra pregunta] (http://stackoverflow.com/a/ 882437/873282) fue mejor: '[\ xE0- \ xFF]' – koppor

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

encontrarán cada carácter que no es un archivo ASCII glífico carácter, pestaña, espacio o salto de línea.

Si informa 0D s (devolución de carro) en archivos que son O.K., entonces cambie \t\n a \t\n\r.

Si solo informa 0D s en archivos que son incorrectos, entonces probablemente pueda reparar esos archivos ejecutando dos2unix en ellos.

+0

Solo un apéndice, uno debe ejecutar la entrada como el argumento final no incluido en la lista. –

+0

Así, ¡gracias! Tuve que cambiarlo ligeramente para una consola DOS: 'perl -wne" printf qq (byte% 02X en la línea $. \ N), ord $ y while s/[^ \ t \ n \ x20- \ x7E]//; rplantiko

2

Si utiliza tabuladores en el código fuente, así, tratar este patrón:

[^\x08-\x7E] 

Works también en Notepad ++

Cuestiones relacionadas