すべて大文字に変換したいUTF-8.txtファイルがいくつかあります。 ASCIIだけの場合は、次を使用できます。
tr [:lower:] [:upper:]
しかし、発音区別符号などを使用しているため、動作しないようです。適切なロケールを設定すればうまくいくと思いますが、このスクリプトを移植可能にする必要があります。
すべての:
tr '[:lower:]' '[:upper:]'
(引用符を忘れないでください。そうしないと、現在のディレクトリに:
、l
、...、またはr
というファイルがある場合は機能しません)または:
awk '{print toupper($0)}'
または:
dd conv=ucase
現在のロケールで定義されている規則に従って、文字を大文字に変換することを目的としています。ただし、ロケールが文字セットとしてUTF-8を使用し、小文字から大文字への変換を明確に定義している場合でも、少なくともGNU dd
、GNU tr
およびmawk
(Ubuntuのデフォルトのawk
)たとえば)それらに従わないでください。また、C
またはPOSIX
以外のロケールを指定する標準方法がないため、現在のロケールに関係なく、移植可能なUTF-8ファイルを大文字に変換したい場合は、標準のツールチェストで運が良かった。
しばしば、移植性のために、あなたの最善の策はPerlかもしれません:
$ echo lľsšcčtťzž | PERLIO=:utf8 Perl -pe '$_=uc'
LĽSŠCČTŤZŽ
ここで、特定の文字の大文字バージョンが何であるかについて全員が同意するわけではないことに注意する必要があります。
たとえば、トルコ語のロケールでは、大文字のi
はI
ではなく、İ
(<U0130>
)です。ここでは、GNUtrの代わりに家宝ツールチェスト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
で定義されており、たとえば、C.UTF8
ロケールのGNU libc toupper()
とはいくつかの文字で異なる動作をすることがわかりました。 Perl
の方が正確です。たとえば、Perl
は ɀ を Ɀ に正しく変換しますが、GNU libc(2.17)は変換しません。
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Ž
これはOSXのtr
では機能しますが、GNU tr
:では機能しません。
tr '[:lower:]' '[:upper:]'
これはgawk
では機能しますが、mawk
またはnawk
(OSXでは/usr/bin/awk
)では機能しません。
awk '{print toupper($0)}'
別のオプションはGNU sed
を使用することです:
sed 's/./\u&/g'
Bash 4.0以降では、^^
パラメーター展開を使用することもできます。
while IFS= read -r l;do printf %s\\n "${l^^}";done