すべてのテキストを大文字から小文字に、またはその逆に変換しますか?

すべてのテキストを大文字から小文字に、またはその逆に変換しますか?

私の質問は、すべてのテキストを大文字から小文字に、またはその逆に変換する方法です。つまり、すべての文字の大文字と小文字を変更します。どういうわけか代替によって行われるべきですsed

答え1

簡単なアプローチは次のとおりですsed

$ echo qWeRtY | sed -e 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'
QwErTy

または、sed小文字の<->大文字変換が存在するロケールのすべての文字を処理するGNUのより短い方法を使用します。

$ 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'
ΑβΓ

答え2

sedPOSIXly、音訳したい文字セット全体を指定しないと、これはできません。@cuonglmさんが表示しました

しかし、それは可能ですtr。そしてここにありますtr(音訳):

tr '[:lower:][:upper:]' '[:upper:][:lower:]'

しかし、Linuxには制限があります。trLinuxベースのシステムの3つの一般的な実装のうち:

  • GNUの場合、trシングルバイト文字セットでのみ機能します。たとえば、Stéphane ChazelasUTF-8ロケールはsTéPHANE cHAZELASnoを提供しますsTÉPHANE cHAZELAS。これはGNUの既知の制限ですtr
  • Heirloom Toolboxではtrこれは機能しませんstéphane chazelas
  • busyboxはこれをしませんtr

しかし、FreeBSDではうまく動作します。認証されたUnixシステムでも正常に動作すると予想できます。


シェルにはbash次の専用演算子があります。

in=AbCdE
out=${in~~}

そしてzsh -o extendedglob

out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}}

答え3

主な目標がサブクラスのファイルを親クラスに変換することであれば、ファイルを変換するためにtr使用するのですか?STDOUT

$cat FILENAME | tr a-z A-Z > FILENAME2

FILENAME元のファイルはどこにありますか?FILENAME2変換された出力ファイルはどこにありますか?

答え4

rubyコマンドラインの使用法に似た文字列方法があります。perl

$ echo 'qWeRtY' | ruby -pe '$_.swapcase!'
QwErTy

また、見ることができますRuby-docエンコーディング

$ ruby -e 'puts Encoding.default_external'
UTF-8
$ echo 'αΒγ'  | ruby -pe '$_.swapcase!'
ΑβΓ

関連情報