web-dev-qa-db-ja.com

UTF-8 txtファイルをbashですべて大文字に変換するにはどうすればよいですか?

すべて大文字に変換したいUTF-8.txtファイルがいくつかあります。 ASCIIだけの場合は、次を使用できます。

tr [:lower:] [:upper:]

しかし、発音区別符号などを使用しているため、動作しないようです。適切なロケールを設定すればうまくいくと思いますが、このスクリプトを移植可能にする必要があります。

10
VPeric

すべての:

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Ž

ここで、特定の文字の大文字バージョンが何であるかについて全員が同意するわけではないことに注意する必要があります。

たとえば、トルコ語のロケールでは、大文字のiIではなく、İ<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)は変換しません。

14

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
slm

これは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
2
nisetama