大文字の行のみを小文字に変換

大文字の行のみを小文字に変換

たとえば、次のような場合があるとします。

One, Two.
OnE, Two.
ONE, TWO.

すべての大文字の行を小文字に置き換えたいので、次のような結果を得ます。

One, Two.
OnE, Two.
one, two.

努力しています:

gsed '/[a-z]/!c\L&'

行と正確に一致しますが、L&に置き換えられます。

One, Two.
OnE, Two.
L&

どのように小文字に変換できますか?

Lの前にバックスラッシュを2〜3個試しましたが、出力にのみ表示されます。

より良いオプションがある場合は、awk、tr、または他のユーティリティを使用します。

また、バージョンが重要な場合:

gsed --version
gsed (GNU sed) 4.9

答え1

POSIX awkを使用してください。

$ awk '!/[[:lower:]]/ { $0=tolower($0) } 1' file
One, Two.
OnE, Two.
one, two.

答え2

機能するにはforを使用する必要があると思います。たとえば、次のようになりs///ます。&

$ sed -e '/[a-z]/!s/.*/\L&/' < test.txt
One, Two.
OnE, Two.
one, two.

Perlを使用して同じまたは類似の操作を実行できます(GNU sedが利用できない場合は利用可能です)。

% perl -pe 's/.*/\L$&/ if not /[[:lower:]]/' < test.txt
One, Two.
OnE, Two.
one, two.

または:

% perl -pe '$_ = lc if not /[[:lower:]]/' < test.txt
One, Two.
OnE, Two.
one, two.

答え3

そしてPerl三項演算子:

$ perl -ne 'print /[a-z]/ ? $_ : lc' file
One, Two.
OnE, Two.
one, two.

説明する

オペレーター 重要性
perl 実行可能ファイル
-n 私たちが使用しているように、現在のファイルの内容を解析します。while (<>) ...
-e パールe表現
print 印刷
/regex/ ? : ブール結果に基づいて一致する三項演算子regex
/[a-z]/ 小文字の一致がある場合...
$_ ...現在行の現在のデフォルト変数を印刷します。$_
lc l...そうでない場合は、現在の行をoweseとして印刷しますc(暗黙的に使用されます$_)。

答え4

私の(短くて甘い)Perlソリューションは次のとおりです。

perl -wpe '$_ = lc unless m/[a-z]/' file.txt

高レベルの説明:これは次のとおりです。fileの各行を印刷する前に、その行file.txtを小文字に変換してください。〜しない限りすべて小文字が含まれています。

次のようにm/[a-z]/変更することもできます。tr/a-z//

perl -wpe '$_ = lc unless tr/a-z//' file.txt

これらの違いはブール値m/[a-z]/として評価することを目的としています(つまり、文字athruを含めますかz)。tr/a-z//数字a範囲内の文字数z。 (0より大きい数値を返す場合、小文字(例$_ = lc)はいいえ発生する。 )

どちらが良いですか?まだベンチマークしてみたことはありませんが、その違いはおそらく小さくなるので、もっと慣れているものを使用するのが最善です。

しかし、覚えておいてください:このm/[a-z]/メソッドは[]かっこを使用しますが、このメソッドは2つのsで連続して終了しませtr/a-z//ん。/どちらも覚えているのはやや面倒なことがあるので、覚えやすいものを使用することをお勧めします。

関連情報