同じことをするには国際化ユーティリティが必要です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
ベストアンサー1
GNUはsed
マルチバイト文字を処理します。だから:
$ echo é½Æ | sed 'y/é½Æ/ABŒ/'
ABŒ
GNUがまだ国際化されていないのではなく、tr
マルチバイト文字(UTF-8ロケールの非ASCII文字など)をサポートしていません。 GNUは、iso8859-15文字セットなど、シングルバイトであれば使用tr
できます。Æ
Œ
詳しくは以下をご覧ください。trにASCII以外の(Unicode)文字を認識させる方法は?
とにかく、これはLinuxとは関係がなく、tr
システムの実装に関連しています。システムがLinuxをカーネルとして使用するのか、Linux用に構築したのか、LinuxカーネルAPIを使用しているのかtr
は重要ではありません。これは、このtr
機能部分がユーザー空間で発生するためです。
busyboxtr
とGNUはLinux用に構築された最も一般的なソフトウェアディストリビューションであり、マルチバイト文字をサポートしていません。ただし、heirloomツールボックス(OpenSolarisに移植されている)やast-openツールボックスtr
など、Linuxに移植された他のディストリビューションもあります。tr
のようにはサポートされていませんsed
。また、埋め込みスクリプトがUTF-8文字セットで作成されている場合は、UTF-8以外の文字セットを含むロケールからスクリプトを呼び出すと、期待どおりに機能しなくなります。y
a-z
sed 'y/é½Æ/ABŒ/'
別の方法は、次のものを使用することです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/♣\`/&'/"
(0x5c)のエンコーディングは他\
の文字にも含まれているため(たとえばα
、0xa3 0x5cおよびUTF-8エンコーディングは♣
0xa3で終わるため)、文字セットBIG5-HKSCSを持つロケールでは失敗します。
とにかく、これは期待しないでください。
perl -Mopen=locale -Mutf8 -pe 'y/Á-Ź/A-Z/'
鋭いアクセントを取り除くようにしてください。上記は実際には
perl -Mopen=locale -Mutf8 -pe 'y/\x{c1}-\x{179}/\x{41}-\x{5a}/'
つまり、範囲はUnicodeコードポイントに基づいています。したがって、範囲は「」内にある明確に定義されたシーケンスの外では役に立ちません。正しい「Unicodeの順序はA-Z
、です0-9
。
鋭いアクセントを削除するには、次の高度なツールを使用する必要があります。
perl -Mopen=locale -MUnicode::Normalize -pe '
$_ = NFKD($_); s/\x{301}//g; $_ = NFKC($_)'
つまり、Unicode正規化形式を使用して文字を分解し、アクセントマーク(ここでは結合形式U+0301
)を削除して再組み立てします。
Unicodeを翻訳するのに役立つもう1つのツールuconv
は次のとおりです。集中治療室。たとえば、上記の式は次のように書くこともできます。
uconv -x '::NFKD; \u0301>; ::NFKC;'
ただし、UTF-8データでのみ機能します。以下を行う必要があります。
iconv -t utf-8 | uconv -x '::NFKD; \u0301>; ::NFKC;' | iconv -f utf-8
ユーザーのロケールでデータを処理する能力。