2012-07-20 10 views
8

Tengo un archivo de texto con caracteres de distintos idiomas como (chino, latín, etc.)Retire las líneas que contienen no-Inglés (ASCII) de un archivo

Quiero eliminar todas las líneas que contienen estos no-Inglés caracteres. Quiero incluir todos los caracteres en inglés (a-b), números (0-9) y todas las puntuaciones.

¿Cómo puedo hacerlo utilizando herramientas de Unix como awk o sed?

Respuesta

15

Perl soporta una clase [:ascii:] carácter.

perl -nle 'print if m{^[[:ascii:]]+$}' inputfile 
+0

Gracias. Esto funcionó perfectamente. – Sudar

2

Puede utilizar egrep -v para devolver sólo las líneas no coinciden con el patrón y usar algo como [^ a-zA-Z0-9.,;:-'"?!] como patrón (incluir más puntuacion según sea necesario).

Hm, pensando en ello, una doble negación (-v y la clase de caracteres invertidos) probablemente no sea tan buena. Otra forma podría ser ^[ a-zA-Z0-9.,;:-'"?!]*$.

También se puede simplemente filtrar para ASCII:

egrep -v "[^ -~]" foo.txt 
+0

Necesito toda la puntuacion. Entonces, ¿es posible filtrar todos los caracteres no ascii, en lugar de especificar la lista de caracteres permitidos? – Sudar

+1

Quizás sea tangencial a su punto principal, pero el rango [a-z] incluye caracteres no ascii en algunas configuraciones regionales. Por ejemplo, en mi sistema, 'echo é | grep [a-z] 'encuentra el é. – Anachrome

1

Usted puede utilizar AWK, con tal fuerza el uso de la configuración regional C:

LC_CTYPE=C awk '! /[^[:alnum:][:space:][:punct:]]/' my_file 

La variable de entorno LC_TYPE=C (o LC_ALL=C) forzar el uso de la configuración regional C para la clasificación de caracteres. Cambia el significado de las clases de caracteres ([:alnum:], [:space:], etc.) para que coincidan solo con caracteres ASCII.

Las líneas rectas /[^[:alnum:][:space:][:punct:]]/ coinciden con cualquier carácter que no sea ASCII. El ! antes de la expresión regular invierte la condición. Entonces, solo las líneas sin ningún carácter que no sea ASCII coincidirán. Luego, como no se realiza ninguna acción, la acción predeterminada se usa para las líneas coincidentes (print).

EDIT: Esto también se puede hacer con grep:

LC_CTYPE=C grep -v '[^[:alnum:][:space:][:punct:]]' my_file 
1

Con grep de GNU, que es compatible con Perl expresiones regulares compatibles, se puede utilizar:

grep -P '^[[:ascii:]]+$' file 
Cuestiones relacionadas