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


17

私の質問は、すべてのテキストを大文字から小文字に、またはその逆に変換するにはどうすればよいですか?それは、すべての文字の大文字小文字を変更することです。sed何とか交換して行わなければなりません。


4
trは、よりも適していsedます。
チョロバ14年

回答:


20

ここにまっすぐな方法があり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'
ΑβΓ

3
2番目のsed例では、入力にGNU と代替ケースを想定しています。sed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'代わりに使用します(GNU固有)。最初の文字は26個のASCIIラテン文字のみを変換し、2番目の文字はロケールによって認識された文字を変換します。これtrはASCIIロケールでのみ意味があります。perl1はASCIIラテン文字のために動作します。
ステファンシャゼル14年

16

POSIXly、@ cuonglmが示したようsedに音訳したい文字の完全なセットを提供することを除いて、それを行うことはできません。

trしかし、それを行うこともできます。それはtr(音訳する)ためです:

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

ただし、Linuxでは制限があります。trLinuxベースのシステムで一般的に見られる3つの実装のうち:

  • GNU trでは、シングルバイト文字セットでのみ機能します。たとえばStéphane Chazelas、UTF-8ロケールでは、のsTéPHANE cHAZELAS代わりにが表示されsTÉPHANE cHAZELASます。これはGNUの既知の制限ですtr
  • tr家宝からtoolchest、それは(あなたが得る動作しません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]}}

それでは、デスクトップの世界ではOSXだけがそれを行いますか?なぜ機能しないのですか?アクセント付き文字の小文字バージョンと大文字の対応バージョンの間に16進値に一定のオフセットがあるように見えるので、それは異なる実装ですか?

1
@illuminÉ、あなたがデスクトップの世界で何を意味するのか分かりません。AFAICS、問題はGNUにあり、ほとんどのUnicesには「デスクトップ」があります。ASCIIと一部のiso8859文字セットは別として、16進オフセットを一般化できることを知らないので、UTF-8のようなエンコードでは意味がありません。たとえば、UTF-8では、大文字(e2 b4 a0)は(e1 83 80)です。両方i(69)とı(C4 b1は)持っているI(49)として(トルコ語ロケールを除く、大文字iになりİ)。GNUで動作しない理由trは、GNUがtr文字ではなくバイトで動作するためです。
ステファンシャゼル14年

私はちょっと主流を意味していましたが、それは本当に意味をなさないので、ヘッドアップに感謝します。私はフランス語のアクセント文字(および実際には "é")を見て、非常に単純な仮定を立てましたが、バイトであることを忘れました。しかし、家宝のものですか?その答えをもう一度読みに行きます!

1
照らす@、家宝のために、それは別の問題だ、それだけで一つだけの発生をサポート思える[:lower:][:upper:](最初のものは無視されるように)。フランス語でœ -> Œc5 93 -> c5 92、UTF-8およびbd -> bciso8859-15です。
ステファンシャゼル14年

2

これには、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

ただし、ケースは入れ替わりません(in aBcはに変換されませんAbC)。
ステファンシャゼル14年

1
@StéphaneChazelas-本当ですが、誤解しない限り、それは問題ではありませんでしたか?
mikeserv 14年

2

あなたの主な目的がファイルを下位クラスから上位クラスに変換することである場合、なぜあなたはあなたのファイルを使用trSTDOUTて変換しないのですか:

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

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


éたとえば、(少なくとも私のファイルでは)アクセント付き文字では機能しませんでした。
シグル

1

を使用してawk

awk '{print tolower($0)}' file.txt | tee file.txt

これがうまくいくと確信していますか?>file.txtファイルを切り捨てることから始めます
iruvar

2
その後、あなたは明らかにそれを試していない。
ステファンシャゼル

0

ruby そのための文字列メソッドがあり、コマンドラインからの同様の使用法 perl

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

ruby-docエンコーディングも参照してください

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.