2012-11-14 6 views
13

Ich versuche eine Wortliste aus einer russischen Kurzgeschichte zu extrahieren.tr [: upper:] [: lower:] mit kyrillischem Text

#!/bin/sh 

export LC_ALL=ru_RU.utf8 

sed -re 's/\s+/\n/g' | \ 
sed 's/[\.!,—()«»;:?]//g' | \ 
tr '[:upper:]' '[:lower:]' | \ 
sort | uniq 

jedoch der tr Schritt wird die kyrillischen Großbuchstaben nicht Kleinschreibung. Ich dachte, ich wäre clever mit den tragbaren Charakterklassen!

$ LC_ALL=ru_RU.utf8 echo "Г" | tr [:upper:] [:lower:] 
Г 

Falls es relevant ist, erhielt ich den russischen Text von copy-Einfügen aus einem Fenster Chrome-Browser in Vim. Es sieht direkt auf dem Bildschirm aus (ein Putty-Terminal). Dies ist in Cygwins bash-Shell - es sollte identisch zu Bash unter Linux funktionieren (sollte!).

Was ist eine tragbare, zuverlässige Möglichkeit, Unicode-Text in einer Pipe in Kleinbuchstaben zu schreiben?

+1

Conversion mit 'sed' funktioniert für mich:' echo 'СТЭК' | sed 's/[[: upper:]] */\ L & /' ' –

+1

' echo "Ã" | tr [: upper:] [: lower:] 'gibt" г "korrekt auf einem Mac OS X 10.8-System aus. – ulidtko

+0

Danke @LevLevitsky. Das ist eine geeignete Lösung für mich (zögern Sie nicht, es in eine Antwort zu befördern). Ich frage mich, warum tr nicht funktioniert. – slim

Antwort

9

Dies ist, was ich bei Wikipedia gefunden (ohne Bezug, obwohl):

Die meisten Versionen von tr, einschließlich GNU tr und klassische Unix tr, arbeitet auf Single-Byte-Zeichen und ist nicht Unicode-kompatibel. Eine Ausnahme ist die Heirloom Toolchest Implementierung, die grundlegende Unicode-Unterstützung bietet.

Auch this ist alt, aber verwandt.

Wie ich im Kommentar erwähnt, scheint sed zu arbeiten (GNU sed, mindestens):

$ echo 'СТЭК' | sed 's/[[:upper:]]*/\L&/' 
стэк 
+3

Ja, das Single-Byte-Problem ist wahr. Ich habe dies einmal als Fehler bei GNU gemeldet und sie erklärten, dass dies so geplant ist (d. H. Sie müssten die Kompatibilität mit alter Software unterbrechen, um sie zu beheben). Ich habe es auch in einer Mailing-Liste besprochen und es wurde ähnlich gesagt (es sollte so sein) (http://lists.gnu.org/archive/html/bug-coreutils/2004-10/msg00063.html). –

+2

Denken Sie daran, dem regulären Ausdruck das Flag g hinzuzufügen, wenn Sie alle Vorkommen ersetzen möchten. –

+0

GNU sed 4.4 macht das nicht mehr richtig. :-( –