回答:
ここにまっすぐな方法がありsedます:
$ echo qWeRtY | sed -e 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'
QwErTy
またはGNU sedを使用した短い方法で、ロケールに小文字の<->大文字の変換が存在する任意の文字を操作します。
$ echo qWeRtY | sed -E 's/([[:lower:]])|([[:upper:]])/\U\1\L\2/g'
QwErTy
次のような別のツールを使用できる場合:
perl (ASCII文字に制限):
$ echo qWeRtY | perl -pe 'y/[a-z][A-Z]/[A-Z][a-z]/'
QwErTy
perl (より一般的に):
$ echo 'αΒγ' | perl -Mopen=locale -pe 's/(\p{Ll})|(\p{Lu})/uc($1).lc($2)/ge'
ΑβΓ
sed例では、入力にGNU と代替ケースを想定しています。sed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'代わりに使用します(GNU固有)。最初の文字は26個のASCIIラテン文字のみを変換し、2番目の文字はロケールによって認識された文字を変換します。これtrはASCIIロケールでのみ意味があります。perl1はASCIIラテン文字のために動作します。
POSIXly、@ cuonglmが示したようsedに音訳したい文字の完全なセットを提供することを除いて、それを行うことはできません。
trしかし、それを行うこともできます。それはtr(音訳する)ためです:
tr '[:lower:][:upper:]' '[:upper:][:lower:]'
ただし、Linuxでは制限があります。trLinuxベースのシステムで一般的に見られる3つの実装のうち:
trでは、シングルバイト文字セットでのみ機能します。たとえばStéphane Chazelas、UTF-8ロケールでは、のsTéPHANE cHAZELAS代わりにが表示されsTÉPHANE cHAZELASます。これはGNUの既知の制限ですtr。tr家宝からtoolchest、それは(あなたが得る動作しませんstéphane chazelas)。trがするようなことではありません。ただし、FreeBSDでは問題なく動作します。認定されたUnixシステムでも同様に機能すると期待するでしょう。
bashシェルは、そのための専用の演算子があります。
in=AbCdE
out=${in~~}
でzsh -o extendedglob:
out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}}
ⴠ(e2 b4 a0)はჀ(e1 83 80)です。両方i(69)とı(C4 b1は)持っているI(49)として(トルコ語ロケールを除く、大文字iになりİ)。GNUで動作しない理由trは、GNUがtr文字ではなくバイトで動作するためです。
[:lower:]か[:upper:](最初のものは無視されるように)。フランス語でœ -> Œもc5 93 -> c5 92、UTF-8およびbd -> bciso8859-15です。
これには、trStéphaneChazelasが提供するソリューションと同じ制限がありますが、別の方法です。
{ echo QWERTYqwerty | dd conv=lcase
echo QWERTYqwerty | dd conv=ucase
} 2>/dev/null
qwertyqwerty
QWERTYQWERTY
ファイル記述子に対するすべての操作の統計も提供するためstderr、/dev/nullそこにダンプします。これは、何をしているのかにもよりますが、このデモ用ではありません。たとえば、他にできることはすべて適用されます:dd2dd
echo QWERTYqwerty | dd bs=1 cbs=6 conv=unblock,ucase 2>/dev/null
QWERTY
QWERTY
aBcはに変換されませんAbC)。
ruby そのための文字列メソッドがあり、コマンドラインからの同様の使用法 perl
$ echo 'qWeRtY' | ruby -pe '$_.swapcase!'
QwErTy
ruby-docエンコーディングも参照してください
$ ruby -e 'puts Encoding.default_external'
UTF-8
$ echo 'αΒγ' | ruby -pe '$_.swapcase!'
ΑβΓ
シンプルなものをシンプルにしましょう。文字を翻訳するために設計されたフィルターはtrです。
echo 1ude1UDE | tr [:upper:][:lower:] [:lower:][:upper:]
trは、よりも適していsedます。