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およびddGNU(trUbuntuのmawkデフォルト値など)はこれに従わないことに注意してください。awk残っているもの基準Cまたは以外のロケールを指定する方法を使用POSIXしているため、現在のロケールに関係なくUTF-8ファイルを大文字に移植可能に変換したい場合は、標準のツールボックスを使用できません。

一般に、移植性のための最良の選択はおそらくPerlです。

$ echo lľsšcčtťzž | PERLIO=:utf8 perl -pe '$_=uc'
LĽSŠCČTŤZŽ

今、特定の文字の大文字のバージョンが何であるかについて誰もが同意するわけではないことに注意してください。

たとえば、トルコ語のロケールでは、大文字ではiなく()です。ここでは、GNU trの代わりにガボツールボックスを使用します。Iİ<U0130>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)はそうではありません。

おすすめ記事