web-dev-qa-db-ja.com

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

いくつかの小文字と大文字の内容を含むtempファイルがあります。

入力

tempファイルの内容:

hi
Jigar
GANDHI
jiga

すべてを変換したい上から下

コマンド

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

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

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

出力

私はそれを次のようにしたいです:

hi
jigar
gandhi
jiga

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

91
JigarGandhi

入力に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
135
Anthon

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

_$ vim filename
gg0guGZZ
_

ファイルを開き、ggは最初の列_0_の最初の列に移動します。 guGを使用すると、すべての文字の大文字と小文字がファイルの末尾まで下がります。 ZZ保存して終了します。

それはあなたが投げるほとんどすべてのものを処理するはずです。数字を無視し、非ASCIIを処理します。

逆にしたい場合は、小文字を大文字に変換し、uUに置き換えてください。_gg0gUGZZ_と設定できます。

30
TankorSmash

私は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 redirectは、ddのデフォルトのステータスレポートとそのstderrを破棄します。これがないと、ddは、処理されたバイト数などの情報を出力して、上記のようなジョブの完了を追跡します。

18
mikeserv

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

Perl -pe '$_=lc' temp

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

そのバリエーションは

Perl -ne 'print lc' temp

-nの使用は-pと似ていますが、$_が最後に出力されない点が異なります。したがって、その変数に保存する代わりに、明示的な印刷ステートメントを含めています。

Sedとは対照的なPerlの利点の1つは、GNU拡張機能が必要ないことです。GNU以外の環境との互換性が必要であるが、すでにPerl asaに依存しているプロジェクトもあります。 trと比較すると、Perl lcの方がロケールに対応しやすいため、詳細についてはperllocaleのマニュアルページを参照してください。

13
MvG

一致したパターンをキャプチャして、モディファイアと置き換えて使用する必要があります。

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

\(...\)は、一致する囲んでいるテキストを「キャプチャ」します。最初のキャプチャは_\1_に、次は_\2_などに移動します。 。

_\L_は、キャプチャしたパターンを小文字に変換します。大文字の_\U_もあります。

9
wurtel

MvGの回答に加えて、Perl 6を使用することもできます。

Perl6 -pe .=lc temp

ここで$ _は暗黙的であり、シェルによる展開から保護するために単一引用符は必要ありません($ _は特別なBashパラメーターです。以下を参照してください https://www.gnu.org/software/ bash/manual/html_node/Special-Parameters.html

1
ozzy