UTF-8 txtファイルをbashですべて大文字に変換する方法は?


10

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

tr [:lower:] [:upper:]

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

回答:


14

すべての:

tr '[:lower:]' '[:upper:]'

(引用符を忘れて、そうでないことはないでしょう仕事と呼ばれるファイルがあるかどうません:l、...またはr現在のディレクトリ内)または:

awk '{print toupper($0)}'

または:

dd conv=ucase

現在のロケールで定義されているルールに従って、文字を大文字に変換するためのものです。ただし、ロケールが文字セットとしてUTF-8を使用し、小文字から大文字への変換を明確に定義している場合でも、少なくともGNU dd、GNU tr、およびmawkawkUbuntu のデフォルトなど)はこれらに従いません。また、または以外のロケールを指定する標準的な方法はないため、現在のロケールに関係なく、移植性の高いUTF-8ファイルを大文字に変換する場合、標準のツールチェストではうまくいきません。CPOSIX

しばしば、移植性のために、あなたの最善の策はperlかもしれません:

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

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

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


その価値のために、私はチェコ語の文字を使用しています(使用した例は実際にはスロバキア語です)。すべての大文字が明確に定義されていますが、ロケールセットはチェコ語ではなくCになるため、問題です。Perlはこのツールチェーンですでに使用されているため、別の用途を追加してもそれほど悪くはないかもしれません。詳細な説明をありがとうございます。
VPeric 2013

3

あなたはこれ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Ž

@StephaneChazelas-ありがとう、失敗した例を変更しました。
slm

これは、現在のロケールと、trまたはawk実装に依存します。たとえばtr、現在のロケールによれば、ほとんどがUTF8ロケールの文字を正しく変換しますが、GNU trはそうではありません。mawkしません。
ステファンChazelas

1
実際、FreeBSD(9.1)では、その逆です。それはで動作trしますが、ないawk
ステファン・Chazelas

@StephaneChazelas-私は分散に精通していません8-)。誰かが反対票を投じましたが、なぜでしょうか?
slm

2

これはOS Xで機能しますtrが、GNU では機能しませんtr

tr '[:lower:]' '[:upper:]'

これgawkは、mawkまたはnawk/usr/bin/awkOS 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.