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
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のツールチェスト。
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が文字セットではないロケールでスクリプトが呼び出されても、それらの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
ユーザーのロケールでデータを処理できるようにするため。
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
それはあなたのエンコーディングスキームかもしれません。次のように、iconvで実行してみてください。
echo Ångstrom | iconv -f UTF-8 | tr 'Å' 'Œ'
付属品:Œngstrom