Bash中的Locale-aware大写字母?

时间:2009-12-16 13:22:10

标签: bash locale

如何使语言环境感知大写操作?

标准tr'[:lower:]''[:upper:]'技巧不起作用:

=$ echo żółw | tr "[:lower:]" "[:upper:]"
żółW

(应该是ŻÓWW)

我宁愿避免使用Perl或其他任何重量级的东西。

2 个答案:

答案 0 :(得分:2)

如果你的bash足够新,它可以做到(见bash-4.0 NEWS item 1.hh.)。

bash -c 'foo="żółw"; echo ${foo^^}'

zsh(自4.3.3开始?):

zsh -c 'foo="żółw"; echo ${(U)foo}'

答案 1 :(得分:1)

在我看来,如果你想避免重量级人物,你需要自己提供角色,而且,鉴于这是一个真正通用解决方案的不起作用,你将无法使用重量级人物。

一个重量级的解决方案

vinko@parrot:~$ more t.py
# coding: UTF-8
print unicode.upper("żółw".decode('utf-8'))
vinko@parrot:~$ python t.py
ŻÓŁW

需要您指定每个字符的非重量级解决方案

vinko@parrot:~$ echo żół | tr "[żół]" "[ŻÓŁ]"
ŻÓŁ

编辑:基于其他答案和评论,BASH 4.0是区域敏感的并且知道广泛的字符。你必须设置一个合适的语言环境(LC_CTYPE或LC_ALL),以便BASH可以告诉它应该做什么。此外,似乎最近有一些语言环境敏感版本的tr(例如,Mac OSX 10.6)