sed y コマンドを使用してロケールに依存しない大文字化または大文字化を取り消す

sed y コマンドを使用してロケールに依存しない大文字化または大文字化を取り消す

私は大文字を使用したり、大文字として使用したりしない最良の(例:ロケールに依存しない)方法を探していますsed

私はこれがすることができることに気づきましたtr。しかし、より大きなsedスクリプトの一部として資本を削除し、特定の行に対してのみ実行したいと思います。

実際、この解決策はtr私のコンピュータでアクセント文字を無視するようです!

<commands> | tr '[:lower:]' '[:upper:]'

私はyコマンドをsed使用してある文字セットを別の文字セットに置き換えることができることを知っています。これは、文字列を大文字で表示したり、大文字で表示しない場合に使用できます。

しかし、これは素朴なアプローチになります。

<commands> | sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'

アクセント文字を考慮しないからです。

もちろん、両側にアクセント付きの文字を含めることもできますが、より良い方法があるようです。

私はこのような同等クラスを知っていますが[=e=]、この場合「e」のすべてのバリアントと一致します。しかし、yコマンドと一緒に使用できないようです。少なくとも私が望む方法ではありません。

<commands> | sed 'y/[=a=]bcd[=e=]/[=A=]BCD[=E=]/'

sedは上記のことについて文句を言いませんが、うまくいきません。

私も同じ(不足)結果でこれを試しました。

<commands> | sed 'y/[a-z]/[A-Z]/'

私が出会うことができるすべてのキャラクターをリストすることに加えて、私がやりたいことをする方法はありますか?

答え1

GNUからsed ドキュメント、yコマンドを使用するには、ソース文字の長さがターゲット文字の長さと正確に一致する必要があります。左右どちらも正規表現とは見なされません。

以下を実行してください

echo 'forté' | sed 'y/[[:lower:]]/[[:upper:]]/'

与える

fprté

ご覧のとおり、ソース文字は正規表現ではなく文字の束として扱われます。

したがって、出会えるすべての文字を一覧表示することがyコマンドの唯一のオプションであるように見えます。

しかし、GNU sedを使用している場合は、「s」コマンドを使用する別の方法があります!

echo 'forté' | sed 's/[[:lower:]]/\u&/g'
echo 'FORTÉ' | sed 's/[[:upper:]]/\l&/g'

[[:lower:]][[:upper:]]変更する必要があるすべての文字と一致します。\uそして\l変更してください。そして、gその行のすべてのイベントに対してこれらのことが発生していることを確認してください。

関連情報