tr [:upper:] [:lower:]带有西里尔文本

sli*_*lim 15 unicode shell tr

我正试图从俄罗斯短篇小说中提取一个单词列表.

#!/bin/sh

export LC_ALL=ru_RU.utf8

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

然而,这一tr步骤并没有降低西里尔字母大写.我以为我在使用便携式角色课时很聪明!

$ LC_ALL=ru_RU.utf8 echo "?" | tr [:upper:] [:lower:]
?
Run Code Online (Sandbox Code Playgroud)

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

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

Lev*_*sky 12

这是我在维基百科上发现的(没有任何参考):

大多数版本(tr包括GNU tr经典Unix tr)都使用单字节字符,并且不符合Unicode.Heirloom Toolchest实现是一个例外,它提供基本的Unicode支持.

此外,是旧的,但相关.

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

$ echo '????' | sed 's/[[:upper:]]*/\L&/'
????
Run Code Online (Sandbox Code Playgroud)

  • 是的,单字节问题是正确的.我曾经将此报告为GNU的一个错误,他们解释说这是设计的错误(即他们必须破坏与旧软件的兼容性才能修复它).我也在邮件列表上讨论了它,并且同样[告诉它应该是那样](http://lists.gnu.org/archive/html/bug-coreutils/2004-10/msg00063.html). (3认同)
  • 如果要替换所有出现的内容,请记住将g标志添加到正则表达式中. (2认同)