ファイルの内容を小文字に変換します


85

temp小文字と大文字の内容のファイルがあります。

入力

私のtempファイルの内容:

hi
Jigar
GANDHI
jiga

上位から下位にすべて変換したいです。

コマンド

私は次のコマンドを試しました:

sed -e "s/[A-Z]/[a-z]/g" temp

しかし、間違った出力を得ました。

出力

私はそれが欲しい:

hi
jigar
gandhi
jiga

引数の代替部分には何が必要sedですか?


回答:


122

入力にASCII文字のみが含まれる場合、次のように使用できますtr

tr A-Z a-z < input 

または(覚えやすくIMOを入力するのは簡単ですが、ASCIIラテン文字に限定されませんが、GNUを含む一部の実装trではまだシングルバイト文字に制限されているため、UTF-8ロケールではASCII文字に制限されています):

tr '[:upper:]' '[:lower:]' < input

使用する必要がある場合sed

sed 's/.*/\L&/g' < input

(ここではGNU実装を想定しています)。

POSIX sedを使用すると、すべての音訳を指定する必要があり、変換する文字を選択できます。

sed 'y/AǼBCΓDEFGH.../aǽbcγdefgh.../' < input

awk

awk '{print tolower($0)}' < input

3
これ\LはGNU拡張機能であることに注意してください。
アントン14

\Lこれまでのところ私にとってはうまくいきます。GNU拡張機能
JigarGandhi 14

2
@JigarGandhi。sedUnixコマンドです。異なるシステムには、異なる動作と機能を持つ異なるバリアントがあります。ありがたいことに、最近では、すべてに共通する最小限の機能セットに頼ることができるように、最も適合する規格があります。\Lそれらの中にはなく、GNUによって導入されたsed(標準ex/の同じ演算子と一致するvi)他の実装では一般に利用できません。
ステファンシャゼル14

9
trGNUのような一部の実装trは、マルチバイトロケールでは正しく動作しないことに注意してください(最近ではほとんどのecho STÉPHANE | tr '[:upper:]' '[:lower:]'場合、たとえば試してみてください)。GNUシステムでは、好むかもしれsed変異体またはawkさんをtolower()
ステファンシャゼル14

5
わずかな修正:sed 's/.*/\L&/g' < input\1一致する部分文字列への参照は、ワールトのように括弧で部分文字列を指定しない限り機能しません。ただし、&示されているように、試合全体を表すために使用する方が少しきれいです
エドワードブラウン

30

vimを使用すると、非常に簡単です。

$ vim filename
gg0guGZZ

ファイルを開き、gg最初の行0、最初の列に移動します。を使用するguGと、ファイルの最後まですべての文字の大文字と小文字が区別されます。ZZ保存して終了します。

それはあなたがそれを投げるほぼすべてを処理する必要があります。数字を無視し、非ASCIIを処理します。

反対のことをしたい場合は、小文字を大文字に変えて、uアウトをスワップしてUgg0gUGZZを設定します。


14
笑「超シンプル」
ブランバート

これは明らかに多くのファイルに対してうまくスケールしない
コーリー・ゴールドバーグに

これまでの私の一番好きな答え!!!!
モナジャラル

1
@CoreyGoldbergのvim file1 file2 fileetcようなもの:bufdo gg0guG:w<CR>は、おそらく任意の数のファイルで機能します。ただし、テストしていません!
TankorSmash

それでもにスケールしない@TankorSmash 大きなファイルの数
コーリー・ゴールドバーグ

17

ddはこれが好きです。

<<\IN LC_ALL=C 2<>/dev/null \
dd conv=lcase
hi
Jigar 
GANDHI
jiga
IN

...取得...

hi
jigar
ghandi
jiga

LC_ALL=C任意のマルチバイト大文字が変換されないでしょうが-入力で任意のマルチバイトを保護することです。同じことが(GNU)に も当てはまりますtr-どちらのアプリも、C以外のロケールでは入力マングリングの傾向があります。iconvいずれかと組み合わせて包括的なソリューションを実現できます。

2>/dev/nullリダイレクト破棄ddのデフォルトのステータスレポート-とその標準エラー出力。それなしでddは、上記のようなジョブの完了に続き、処理されたバイト数などの情報を印刷します。


このソリューションはtr、大きなファイルを処理する場合よりもはるかに高速です、ありがとう!
-WhiteWinterWolf

13

Perl 5を使用することもできます。

perl -pe '$_=lc' temp

このオプション-pは、入力の各行に対して指定された式を1回実行し、結果、つまりの最終値を出力するようにperlに指示します$_-eスクリプトを含むファイルではなく、プログラムが次の引数になることを示します。lc小文字に変換します。引数なしでは、で動作し$_ます。そして$_=、それを再び保存して、印刷されるようにします。

そのバリエーションは

perl -ne 'print lc' temp

使用-nは、最終的に印刷されないこと-pを除いて似てい$_ます。そのため、その変数に保存する代わりに、明示的なprintステートメントを含めています。

sedとは対照的なPerlの利点の1つは、GNU拡張機能が必要ないことです。非GNU環境と互換性がなければならないプロジェクトがありますが、Perl asa依存関係も既にあります。に比べてtr、Perl lcをロケールに合わせて簡単に作成できる可能性があります。詳細については、perllocalemanページを参照してください。


9

一致したパターンをキャプチャし、それを修飾子で置き換えて使用する必要があります。

sed 's/\([A-Z]\)/\L\1/g' temp

\(...\)囲んで一致したテキスト、最初のキャプチャに進み、「キャプチャ」\1、隣\2など、ナンバリングをネストされたキャプチャの場合には括弧を開くに従います。

\L捕捉されたパターンを小文字に変換するには、もあります\U大文字ため。


3
全体のパターンは常にに巻き込まれている-あなたはこれを行う必要がありいけない&
mikeserv

本当ですが、マッチのキャプチャについて説明する機会を逃してしまったでしょう:
14

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