我有一些 UTF-8 .txt 文件,我想将其转换为全部大写。如果只是 ASCII,我可以使用:
tr [:lower:] [:upper:]
但由于我正在使用变音符号之类的东西,它似乎不起作用。我想如果我设置适当的区域设置,它可能会起作用,但我需要这个脚本是可移植的。
答案1
所有的:
tr '[:lower:]' '[:upper:]'
(不要忘记引号,否则如果当前目录中有一个名为:
, l
, ...的文件,则该命令将不起作用)或:r
awk '{print toupper($0)}'
或者:
dd conv=ucase
旨在根据当前区域设置中定义的规则将字符转换为大写。然而,即使语言环境使用 UTF-8 作为字符集并明确定义从小写到大写的转换,至少 GNU dd
、 GNUtr
和(例如 Ubuntu 上的mawk
默认设置)也不遵循它们。awk
还有,没有标准方式来指定除C
or之外的区域设置POSIX
,因此,如果您想要将 UTF-8 文件可移植地转换为大写,而不管当前区域设置如何,那么您对标准工具箱就不那么幸运了。
通常,为了可移植性,最好的选择可能是 perl:
$ echo lľsšcčtťzž | PERLIO=:utf8 perl -pe '$_=uc'
LĽSŠCČTŤZŽ
现在,您需要注意,并不是每个人都同意特定字符的大写版本是什么。
例如,在土耳其语言环境中,大写字母i
不是I
,而是İ
( <U0130>
)。这里使用传家宝工具箱tr
而不是 GNU tr:
$ echo ií | LC_ALL=C.UTF-8 tr '[:lower:]' '[:upper:]'
IÍ
$ echo ií | LC_ALL=tr_TR.UTF-8 tr '[:lower:]' '[:upper:]'
İÍ
在我的系统中,perl
大写转换在 中定义,我发现它在语言环境中/usr/share/perl/5.14/unicore/To/Upper.pl
的几个字符上的行为与 GNU libc 不同,例如,更准确。例如,正确地将toupper()
C.UTF8
perl
perl
ɀ到Ɀ,GNU libc (2.17) 没有。
答案2
我认为你可以用awk
它的toupper
功能来做到这一点。
例如
不适用于 GNU tr
:
$ echo lľsšcčtťzž | tr '[:lower:]' '[:upper:]'
LľSšCčTťZž
与 GNU 一起工作awk
:
$ echo lľsšcčtťzž | awk '{ print toupper($0) }'
LĽSŠCČTŤZŽ
答案3
这适用于 OS X,tr
但不适用于 GNU tr
:
tr '[:lower:]' '[:upper:]'
这适用于gawk
但不适用于mawk
or nawk
(/usr/bin/awk
在 OS X 中):
awk '{print toupper($0)}'
另一种选择是使用 GNU sed
:
sed 's/./\u&/g'
在 Bash 4.0 及更高版本中,您还可以使用^^
参数扩展:
while IFS= read -r l;do printf %s\\n "${l^^}";done