コマンドラインでテキストの大文字と小文字を切り替える移植可能な方法はありますか?

コマンドラインでテキストの大文字と小文字を切り替える移植可能な方法はありますか?

POSIXオペレーティングシステム間で移植してロケールをサポートする方法はありますか?変化コマンドラインのテキストの大文字と小文字の区別 - つまり、小文字を大文字に置き換えるか、その逆に置き換えます。

使用牛に似た一種の栄養sedでは、次のものを使用できます。

echo 'Yes, I Know IT!' | sed -E 's/([[:upper:]]*)([[:lower:]]*)/\L\1\U\2/g'
yES, i kNOW it!

これはアクセント付きの文字とうまく機能します。

echo Élève | sed -E 's/([[:upper:]]*)([[:lower:]]*)/\L\1\U\2/g'
éLÈVE

\Lしかし、GNU拡張を使用しているため、\U移植性はありません。一方、tr私のLinuxシステムでは、アクセント付きの文字は正しく処理されません。

echo 'Élève' | tr '[:lower:][:upper:]' '[:upper:][:lower:]'
ÉLèVE

解決策はありますか?

答え1

を受け入れると、perlこのソリューションは次から直接コピーされます。Perl、tr関数を使用して大文字を小文字に、またはその逆に同時に変換しますか?あなたのために働くでしょう:

echo 'Hello Élève. It is beautiful!' |
    perl -Mopen=locale -Mutf8 -pe 's/([[:upper:]])|([[:lower:]])/defined $1 ? lc $1 : uc $2/eg'

hELLO éLÈVE. iT IS BEAUTIFUL!

( gsed ... || tr ... )また、GNUのあるシステムではgsed優先順位がありますが、他のシステムtrではそうでないように同様のものを使用するかどうかを知りたいです。おそらく実行するGNUではありません。 (GNU POSIXではない場合は、tr明らかにマルチバイト文字を正しく処理します。)

関連情報