
Como posso exibir e remover todos os caracteres> código ascii 127 de um arquivo?
o arquivo é unicode de 16 bits
ATUALIZAÇÃO Dennis resolveu o problema, mas há uma discussão interessante sobre intervalos de números.
Responder1
Uma abordagem seria converter o arquivo em dígitos hexadecimais, remover os padrões de dígitos que você não deseja e depois converter novamente.
$ echo 'A Unicode character: [ñ]' | xxd -p | sed 's/c3b1//' | xxd -r -p
A Unicode character: []
Você poderia usar AWK ou qualquer outra técnica de manipulação de texto no lugar de sed
. Tenha cuidado com sequências ambíguas.
Deixe-me saber se isso se aproxima do que você tem em mente.
Responder2
Olhando para trás, para esta questão
Parece que usei uma dessas linhas no final
(parece ser o regex de Dennis)
$ xxd -p a.q | tr -d '\n' | sed "s/([0-9a-f]\{4\})/\1 /g" | sed -r "s/(00[8-9a-f][0-9a-f]|[0-9a-f][1-9a-f][0-9a-f][0-9a-f]|[1-9a-f]0[0-9a-f][0-9a-f])//g" | tr -d ' ' | sed "s/(.*)/feff\1/" | xxd -r -p >a.q2
ou este (parece ser meu regex)
$ xxd -p a.q | tr -d '\n' | sed "s/([0-9a-f]\{4\})/\1 /g" | sed -r "s/(00[89A-F][0-9A-F]|0[1-9A-F][0-9A-F]{2}|[1-9A-F][0-9A-F]{3})//g" | tr -d ' ' | sed "s/(.*)/feff\1/" | xxd -r -p >a.q2
este é um comentário sobre como resolvi isso, com alguns testes.
0080-00FF 00[89A-F][0-9A-F]
0100-0FFF 0[1-9A-F][0-9A-F]{2}
1000-FFFF [1-9A-F][0-9A-F]{3}
e aqui estão alguns testes que mostram que o regex funciona. Eu os coloquei em minha pergunta quando resolvi, mas deveria tê-los colocado em uma resposta.
Total de caracteres hexadecimais 85
$ xxd -u -p a.aa.txt | sed -r "s/.{4}/\0 /g" | grep -oE "[0-9A-F]{4}" | wc -l
85
Total que eu quero, 72
$ xxd -u -p a.aa.txt | sed -r "s/.{4}/\0 /g" | grep -oE "00[0-7][0-F]" | wc -
l
72
Total que eu não quero, 13
$ xxd -p -u a.aa.txt | sed -r "s/[0-9A-F]{4}/\0 /g" | grep -oP '((?!00[0-7][0-9A-F])(?=[^ ]).){4}' | wc -l
13
Total que eu não quero, 13
$ xxd -u -p a.aa.txt | sed -r "s/.{4}/\0 /g" | grep -oE "00[89A-F][0-9A-F]|0[1-9A-F][0-9A-F]{2}|[1-9A-F][0-9A-F]{3}" | wc –l
13