私の質問は、すべてのテキストを大文字から小文字に、またはその逆に変換する方法です。つまり、すべての文字の大文字と小文字を変更します。どういうわけか代替によって行われるべきです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
sed
POSIXly、音訳したい文字セット全体を指定しないと、これはできません。@cuonglmさんが表示しました。
しかし、それは可能ですtr
。そしてここにありますtr
(音訳):
tr '[:lower:][:upper:]' '[:upper:][:lower:]'
しかし、Linuxには制限があります。tr
Linuxベースのシステムの3つの一般的な実装のうち:
- GNUの場合、
tr
シングルバイト文字セットでのみ機能します。たとえば、Stéphane Chazelas
UTF-8ロケールはsTéPHANE cHAZELAS
noを提供します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!'
ΑβΓ