Quais são algumas maneiras de comparar o tipo de arquivo e as codificações para resolver o buggy grep…?

1

Neste caso, eu tenho uma pasta de arquivos .txt que eu criei usando arrastar e copiar e colar do Adobe Acrobat PDFs e Editor de Texto no OSX. Eu tenho editado esses arquivos no vim. Agora estou usando o grep para encontrar anotações nesses arquivos. Por exemplo,

grep -c "\[t\]" Herbert*

[t] é a nota e o diretório tem 22 arquivos com o prefixo de nome Herbert* (como em Herbert-02-Transformation.txt , Herbert-14-Classification.txt ). O problema é que grep encontra apenas a string de pesquisa em um arquivo ( Herbert-03-Square.txt ), mas cada arquivo tem a mesma nota várias vezes.

Os arquivos de problema exibem converted na barra de status quando eu os abro,

"Herbert-02-Transformation.txt" [converted] 276L, 57171C

Uma postagem em unix.stack sugere que os caracteres especiais do original sobreviveram à viagem do PDF para o vim para causar esse problema com grep . Eu tenho apagado os caracteres borked e manualmente inserindo o :digraphs correto. Alguns dos arquivos editados são pesquisáveis pelo grep e outros arquivos editados não são. Tentei usar,

:e Herbert-02-Transformation.txt
:set encoding=utf-8' 
:w

mas o arquivo ainda é aberto como mostrado acima. Agora estou pensando em descobrir como comparar as codificações desses arquivos em que grep está funcionando e aqueles em que não está. Existem páginas de ajuda suficientes detalhando como configurar a detecção de arquivos em .vimrc para evitar esse problema que eu passei mais de 1,5 horas pesquisando isso, e agora acho que é uma boa pergunta ...

    
por xtian 06.04.2013 / 22:30

2 respostas

3

A maneira mais fácil de fazer é passar algumas linhas de um dos arquivos com problemas por meio de od :

head Herbert-02-Transformation.txt | od -c

Ou, se você não encontrar nada de estranho nas primeiras linhas, procure sua string específica e alguns caracteres em torno dela:

od -c Herbert-02-Transformation.txt | grep -C 5 "\["

Por exemplo:

$ echo "lorem ipsum [t] dolor sit amet" > foo.txt
$ od -c foo.txt 
0000000   l   o   r   e   m       i   p   s   u   m       [   t   ]    
0000020   d   o   l   o   r       s   i   t       a   m   e   t  \n
0000037

Qualquer caractere "estranho" será exibido por od .

Outra ferramenta útil é file , que retornará o tipo de arquivo e outras informações:

$ file --mime foo.txt 
foo.txt: text/plain; charset=us-ascii
    
por 06.04.2013 / 22:40
1

Se você tiver um arquivo de texto de uma codificação conhecida, com caracteres inválidos no meio que não pertençam a essa codificação, talvez seja possível filtrá-los com iconv -c -f charset -t charset file . Cuidado para não sobrescrever seu arquivo original no processo, pois o resultado pode ser desastroso se você escolher o conjunto de caracteres incorreto.

por exemplo, se livrando de umlauts:

$ echo Nähkästchen | iconv -c -f us-ascii -t us-ascii
Nhkstchen

Uma pesquisa e substituição pode ser mais apropriada se os caracteres que você tiver lá forem de alguma forma significativos. Depende do que realmente está lá.

    
por 07.04.2013 / 03:32

Tags