Como posso usar ferramentas unix com texto cirílico?

1

Recentemente, comecei a processar texto em cirílico e tem sido muito difícil.

Eu não consegui fazer com que meus scripts Python funcionassem com ele. E eu tentei.

O PHP funcionou bem, mas eu não conheço PHP. Eu apenas consegui hackear algumas coisas e ainda não me sinto confortável nela. (Pode tornar-se um pouco mais importante, no entanto, como se provou ser inesperadamente útil.)

É claro que grep está fora de questão.

Ou é?

É disso que se trata esta questão.

Eu queria fazer isso:

alec@ROOROO:~/$ grep '\w\{4\}' cyrillicstuff

... e veio de mãos vazias.

Mas existe uma maneira que eu poderia ter retornado todas as palavras de 4 caracteres ou mais, dado que elas estão todas em cirílico, usando o bom 'ol grep ??

    
por ixtmixilix 12.06.2012 / 03:50

1 resposta

4

Acredito que você precise usar as classes de caracteres baseadas em unicode. A classe com reconhecimento de localidade para caracteres de palavra é [:alnum:] e isso é usado dentro da classe de caracteres, portanto, o comando seria

grep '[[:alnum:]]\{4\}' cyrillicstuff

e certifique-se de que sua localidade esteja configurada para a codificação na qual o arquivo realmente está. Você pode verificar com o comando locale e procurar o valor que ele dá para a categoria LC_CTYPE .

Esta sintaxe é suportada por todas as ferramentas que usam expressões regulares POSIX básicas ou estendidas como sed, awk etc. e também por perl e "expressões regulares compatíveis com perl" usadas por python e php. Perl e "expressões regulares compatíveis com perl" têm uma sintaxe adicional \pX e \p{xxx} , em que X ou xxx é um nome de categoria unicode, portanto \pL é o mesmo que [:alpha:] e \p{Uppercase} deve ser o mesmo que [:upper:] . Todas as categorias unicode devem ser utilizáveis.

Ad python. O Python também é perfeitamente unicode. No python 3 ele deve funcionar imediatamente, abrindo arquivos na codificação local parece ser o padrão (mas eu apenas procurei, não testei). No entanto, no python 2, você tem que especificar as codificações lá manualmente. Eles devem ser definidos para stdin, stdout e stderr, mas para todos os outros arquivos você deve usar a função codecs.open e especificar a codificação obtida de locale.getpreferredencoding() e inicializar os códigos de idioma como em C com locale.setlocale(locale.LC_ALL, '') . / p>     

por 12.06.2012 / 07:45