たとえば、次のような場合があるとします。
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]/
として評価することを目的としています(つまり、文字a
thruを含めますかz
)。tr/a-z//
数字a
範囲内の文字数z
。 (0より大きい数値を返す場合、小文字(例$_ = lc
)はいいえ発生する。 )
どちらが良いですか?まだベンチマークしてみたことはありませんが、その違いはおそらく小さくなるので、もっと慣れているものを使用するのが最善です。
しかし、覚えておいてください:このm/[a-z]/
メソッドは[
角]
かっこを使用しますが、このメソッドは2つのsで連続して終了しませtr/a-z//
ん。/
どちらも覚えているのはやや面倒なことがあるので、覚えやすいものを使用することをお勧めします。