tr
と同じことを行う国際化されたユーティリティが必要です :ストリームから文字を取得し、対応する文字に置き換えます。
下から上へのような特定のケースのソリューションではありませんが、一般的なケースのソリューションが必要です。コード> 可能であれば電話してください。
tr
に注意してください Linuxでは機能しません。文字ではなくバイトを変換します。これはマルチバイトエンコーディングでは失敗します。
$ tr --version | head -n 1
tr (GNU coreutils) 8.23
$ echo $LC_CTYPE
en_US.UTF-8
$ echo 'Ångstrom' | tr Æ Œ
Ņngstrom
承認された回答:
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
およびGNUtr
Linux用に構築されたソフトウェアのディストリビューションで最も一般的に見られ、マルチバイト文字をサポートしていませんが、 tr
のようにLinuxに移植されたものもあります。 家宝ツールチェスト(OpenSolarisから移植されたもの)またはast-openのツールチェストです。
sed
に注意してください のy
a-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が文字セットではないロケール(例外は yash
)でスクリプトが呼び出された場合でも、一重引用符で囲まれたUTF-8文字を使用しても問題ありません。 これらのバイトがロケールで有効な文字を形成しない場合は文句を言います)。ただし、一重引用符以外の引用符を使用している場合は、問題が発生する可能性があります。たとえば、
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}/'
つまり、範囲はユニコードコードポイントに基づいています。そのため、「正しい」にある非常に明確に定義されたシーケンス以外では、範囲は役に立ちません。 」A-Z
のようなUnicodeでの順序 、 0-9
。
アキュートアクセントを削除する場合は、次のようなより高度なツールを使用する必要があります。
perl -Mopen=locale -MUnicode::Normalize -pe '
$_ = NFKD($_); s/x{301}//g; $_ = NFKC($_)'
つまり、Unicode正規化フォームを使用して文字を分解し、アキュートアクセントを削除します(ここでは、結合フォーム U + 0301
)そして再構成します。
Unicodeを音訳するためのもう1つの便利なツールは、 uconv
です。 ICUから。たとえば、上記は次のように書くこともできます:
uconv -x '::NFKD; u0301>; ::NFKC;'
ただし、UTF-8データでのみ機能します。必要なもの:
iconv -t utf-8 | uconv -x '::NFKD; u0301>; ::NFKC;' | iconv -f utf-8
ユーザーのロケールでデータを処理できるようにするため。