web-dev-qa-db-ja.com

ユニコード文字のtrアナログ?

trと同じことを行う国際化されたユーティリティが必要です。ストリームから文字を取得し、対応する文字に置き換えます。下から上へのような特定のケースソリューションではなく、一般的なケースソリューションが必要です。ゴリオンなしでパイプされたsed呼び出しは可能であれば。

Linuxではtrは機能しないことに注意してください。文字ではなくバイトを変換します。これはマルチバイトエンコーディングでは失敗します。

$ tr --version | head -n 1
tr (GNU coreutils) 8.23
$ echo $LC_CTYPE
en_US.UTF-8
$ echo 'Ångstrom' | tr Æ Œ         
Ņngstrom
7
fedoraman

GNU sedはマルチバイト文字を処理します。そう:

$ echo é½Æ | sed 'y/é½Æ/ABŒ/'
ABŒ

GNU trは国際化されていませんが、マルチバイト文字(UTF-8ロケールの非ASCII文字など)をサポートしていません)はそれほど多くありません。GNU trは、iso8859-15文字セットのようにシングルバイトである限り、ÆŒで機能します。

詳細は trに非ASCII(ユニコード)文字を認識させる方法は?

いずれにせよ、それはLinuxとは何の関係もありません。それは、システムのtr実装に関するものです。そのシステムがLinuxをカーネルとして使用するか、trがLinux用に構築されているか、またはLinuxカーネルAPIを使用するかは、tr機能のその部分がユーザー空間で行われるため、関係ありません。

busybox trおよびGNU trは、Linux用にビルドされたソフトウェアのディストリビューションで最も一般的に見られ、マルチバイト文字をサポートしていませんが、trなどのLinuxに移植されたものもあります。家宝ツールチェスト(OpenSolarisから移植)またはast-openのツールチェスト。

sedya-zのような範囲をサポートしないことに注意してください。また、sed 'y/é½Æ/ABŒ/'を含むスクリプトがUTF-8文字セットで記述されている場合、UTF-8が文字セットではないロケールで呼び出された場合、スクリプトは期待どおりに機能しなくなります。

代わりに、Perlを使用することもできます。

Perl -Mopen=locale -Mutf8 -pe 'y/a-zé½Æ/A-ZABŒ/'

上記では、PerlコードはUTF-8であることが想定されていますが、ロケールのエンコーディングで入力を処理します(および同じエンコーディングで出力します)。 UTF-8ロケールで呼び出された場合、UTF-8 Æ(0xc3 0x86)をUTF-8 Œ(0xc5 0x92)に変換し、ISO8859-15でも同じですが0xc6の場合- > 0xbc。

ほとんどのシェルでは、UTF-8が文字セットではないロケールでスクリプトが呼び出されても、それらのUTF-8文字を一重引用符で囲んでも問題ありません(例外は、yashで、これらのバイトが有効な形式でない場合にエラーになります)ロケールの文字)。ただし、単一引用符以外の引用符を使用している場合は、問題が発生する可能性があります。例えば、

Perl -Mopen=locale -Mutf8 -pe "y/♣\`/&'/"

文字セットがBIG5-HKSCSであるロケールでは、\(0x5c)のエンコーディングが他のいくつかの文字(α:0xa3 0x5cやUTF-8など)にも含まれているため、失敗します。 のエンコードはたまたま0xa3で終わります)。

いずれにせよ、次のようなことを期待しないでください

Perl -Mopen=locale -Mutf8 -pe 'y/Á-Ź/A-Z/'

鋭いアクセントの除去に取り組みます。上記は実際には

Perl -Mopen=locale -Mutf8 -pe 'y/\x{c1}-\x{179}/\x{41}-\x{5a}/'

つまり、範囲はUnicodeコードポイントに基づいています。そのため、範囲は、A-Zのように、Unicodeで「right」の順序になっている非常に明確に定義されたシーケンス以外では役に立ちません。 0-9

鋭いアクセントを削除したい場合は、次のようなより高度なツールを使用する必要があります。

Perl -Mopen=locale -MUnicode::Normalize -pe '
  $_ = NFKD($_); s/\x{301}//g; $_ = NFKC($_)'

つまり、Unicode正規化形式を使用して文字を分解し、鋭アクセントを削除して(ここでは結合形式U+0301)、再構成します。

Unicodeを音訳するもう1つの便利なツールは、uconv from [〜#〜] icu [〜#〜] です。たとえば、上記は次のように書くこともできます。

uconv -x '::NFKD; \u0301>; ::NFKC;'

ただし、UTF-8データでのみ機能します。あなたは必要になるでしょう:

iconv -t utf-8 | uconv -x '::NFKD; \u0301>; ::NFKC;' | iconv -f utf-8

ユーザーのロケールでデータを処理できるようにするため。

9

Bashでは パラメータ展開 を使用できます。

置換Å成功:

$ string='Hello Ångstrom'
$ a='Å'
$ b='Œ'
$ printf '%s\n' "${string//${a}/${b}}"
Hello Œngstrom

代用しようÆ、これは文字列の一部ではありません。

$ string='Hello Ångstrom'
$ a='Æ'
$ b='Œ'
$ printf '%s\n' "${string//${a}/${b}}"
Hello Ångstrom
1
nxnev

それはあなたのエンコーディングスキームかもしれません。次のように、iconvで実行してみてください。

echo Ångstrom | iconv -f UTF-8 | tr 'Å' 'Œ'

付属品:Œngstrom

0