
Tengo un archivo de texto que contiene una gran cantidad de registros, cada uno en una sola línea. Algunos de los registros tienen caracteres especiales que han sido dañados y estoy intentando encontrarlos buscando múltiples secuencias de caracteres superiores ax80
Aquí hay un ejemplo de una sola línea con los caracteres incorrectos resaltados:
La cadena hexadecimal de interés es:
49 CC 80 C2 B9 6E
Cuando uso GNU Grep, grep --color='auto' -P -n "[\x80-\xFF]" record.txt
coincide solo con una parte de la línea, coincide con el superíndice 1 ( ¹
) pero no con Ì
:
Grep no parece ser capaz de separar el carácter combinado + diacrítico...
Lo que me gustaría hacer es conservar solo las líneas que tienen dos o más x80
caracteres consecutivos, y poder hacer coincidir los caracteres reales que aparecen en el código hexadecimal, es decir, 49 CC 80 C2 B9 6E
parece que debería coincidir con algo así "[\x80-\xFF]{2,10}"
, pero esta coincidencia no no trabajo.
Entonces, para aclarar, cuando uso esto, la línea coincide:
grep --color='auto' -P -n "[\x80-\xFF]" record.txt
Pero cuando uso esto, no:
grep --color='auto' -P -n "[\x80-\xFF]{2,10}" record.txt
¿No debería coincidir también el segundo, ya que la secuencia de bytes es CC 80 C2 B9
una cadena de 4 bytes consecutivos con los valores de x80-xFF
?
Respuesta1
Esto podría estar relacionado con la configuración regional. Si es así, usar la configuración regional C (también conocida como POSIX), donde los caracteres son bytes, puede funcionar:
LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]{2,10}" record.txt
Respuesta2
Grep puede resultar complicado con caracteres extraños... prueba:
grep --color='auto' -P -n "[\x80-\xFF]" record.txt | iconv -f utf-16 -t utf-16
Puede que recupere tus letras... pero tus colores se perderán. Podría valer la pena jugar con utf-16 y utf-8.
Y asegúrese de que su consola pueda manejar uft-8 y no esté asignada a alguna configuración ansi.