
Tenho um arquivo de texto que contém um grande número de registros, cada um em uma única linha. Alguns dos registros possuem caracteres especiais que foram corrompidos e estou tentando encontrá-los procurando por múltiplas sequências de caracteres superiores ax80
Aqui está um exemplo de linha única com os caracteres incorretos destacados:
A string hexadecimal de interesse é:
49 CC 80 C2 B9 6E
Quando eu uso o GNU Grep, grep --color='auto' -P -n "[\x80-\xFF]" record.txt
ele corresponde apenas a parte da linha, corresponde ao sobrescrito 1 ( ¹
), mas não ao Ì
:
Grep não parece ser capaz de separar o caractere + diacrítico combinado ...
O que eu gostaria de fazer é manter apenas as linhas que possuem dois ou mais x80
caracteres consecutivos - e poder corresponder aos caracteres reais que aparecem no código hexadecimal - ou seja, 49 CC 80 C2 B9 6E
parece que deveria corresponder a algo como "[\x80-\xFF]{2,10}"
- mas essa correspondência não não funciona.
Então, para esclarecer, quando uso isso, a linha corresponde:
grep --color='auto' -P -n "[\x80-\xFF]" record.txt
Mas quando eu uso isso, isso não acontece:
grep --color='auto' -P -n "[\x80-\xFF]{2,10}" record.txt
O segundo também não deveria corresponder, já que a sequência de bytes é CC 80 C2 B9
uma sequência de 4 bytes consecutivos com os valores de x80-xFF
?
Responder1
Isso pode estar relacionado ao local. Nesse caso, usar o código de idioma C (também conhecido como POSIX), onde os caracteres são bytes, pode funcionar:
LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]{2,10}" record.txt
Responder2
Grep pode ser instável com caracteres estranhos.. tente:
grep --color='auto' -P -n "[\x80-\xFF]" record.txt | iconv -f utf-16 -t utf-16
Pode receber suas cartas de volta... mas suas cores serão perdidas. Pode valer a pena mexer com o utf-16 e o utf-8.
E certifique-se de que seu console seja capaz de lidar com o uft-8 e não esteja atribuído a alguma configuração ansi.