如何在bash中将UTF-8 txt文件转换为全部大写?

如何在bash中将UTF-8 txt文件转换为全部大写?

我有一些 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还有,没有标准方式来指定除Cor之外的区域设置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:]'
$ 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.UTF8perlperlɀⱿ,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但不适用于mawkor 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

相关内容