16

我正在尝试从俄罗斯短篇小说中提取单词列表。

#!/bin/sh

export LC_ALL=ru_RU.utf8

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

但是,该tr步骤不是将西里尔大写字母小写。我以为我很聪明地使用了可移植的字符类!

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

如果它是相关的,我通过从 Chrome 浏览器窗口复制粘贴到 Vim 来获得俄语文本。它在屏幕上看起来很正确(Putty 终端)。这是在 Cygwin 的 bash shell 中——它应该与 Linux 上的 Bash 相同(应该!)。

什么是在管道中小写 unicode 文本的便携、可靠的方法?

4

2 回答 2

13

这是我在Wikipedia上找到的(但没有任何参考):

大多数版本tr,包括GNU tr经典的 Unix tr,都对单字节字符进行操作,并且不兼容 Unicode。一个例外是Heirloom Toolchest实现,它提供基本的 Unicode 支持。

此外,是旧的但相关的。

正如我在评论中提到的,sed似乎有效(GNU sed至少):

$ echo 'СТЭК' | sed 's/[[:upper:]]*/\L&/'
стэк
于 2012-11-14T16:40:14.657 回答
0

这对我有用:

echo ЫЕРУНКЫКТ | sed -e 's/\(.*\)/\L\1/'
于 2021-05-19T10:29:41.770 回答