Como usar o grep / ack com arquivos em codificação arbitrária?

7

Na minha área de trabalho do Linux, eu tenho uma localidade UTF-8. Quando tento pesquisar alguns arquivos codificados em KOI8-R com grep (ack), ele falha. Se eu codificar manualmente o padrão em KOI8-R e passar isso como um argumento, ele funciona.

É possível dizer ao grep que codificação usar para o padrão? Ou alguma outra ferramenta?

    
por Eugene Yarmash 06.03.2012 / 15:55

1 resposta

5

Se todos os arquivos pesquisados tiverem a mesma codificação:

LC_CTYPE=ru_RU.KOI8-R luit ack-grep "$(echo 'привет' | iconv -t KOI8-R)" *.txt

ou no bash ou zsh

LC_CTYPE=ru_RU.KOI8-R luit ack-grep "$(iconv -t KOI8-R <<<'привет')" *.txt

Ou inicie um shell filho na codificação desejada:

$ LC_CTYPE=ru_RU.KOI8-R luit
$ ack-grep 'привет' *.txt
$ exit

Luit (fornecido com XFree86 e X.org) executa o programa especificado em seu comando linha na localidade especificada pela configuração LC_CTYPE , assumindo um terminal UTF-8. Portanto, o comando é executado na localidade desejada e o Luit converte sua saída de terminal para UTF-8.

Outra abordagem, se você tiver uma árvore de diretórios com muitos arquivos em uma codificação diferente, é montar uma exibição dessa árvore de diretórios em uma codificação preferida. Eu acho que o sistema de arquivos fuseflt pode fazer isso (não testado).

mkdir /utf8-view
fuseflt iconv-koi8r-utf8.conf /some/dir /utf8-view
ack-grep 'привет' /utf8-view/*.txt.utf8
fusermount -u /utf8-view

em que o arquivo de configuração iconv-koi8r-utf8.conf contém

ext_in =
ext_out = *.utf8
flt_in =
flt_out = .utf8
flt_cmd = iconv -f KOI8-R -t UTF-8
    
por 06.03.2012 / 16:38