仅将全大写行转换为小写

use*_*049 10 sed text-processing

举个例子,假设我有:

One, Two.
OnE, Two.
ONE, TWO.
Run Code Online (Sandbox Code Playgroud)

我只想将全部大写的行替换为小写,这样我就得到:

One, Two.
OnE, Two.
one, two.
Run Code Online (Sandbox Code Playgroud)

我在尝试:

gsed '/[a-z]/!c\L&'
Run Code Online (Sandbox Code Playgroud)

它正确匹配行,但将其替换为:L&

One, Two.
OnE, Two.
L&
Run Code Online (Sandbox Code Playgroud)

如何将其转换为小写?

我在 L 之前尝试了 2 或 3 个反斜杠,但它只是将它们放入输出中。

如果有更好的选择,我将使用 awk 或 tr 或其他一些实用程序。

另外,如果版本很重要:

gsed --version
gsed (GNU sed) 4.9
Run Code Online (Sandbox Code Playgroud)

Ed *_*ton 18

使用任何 POSIX awk:

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


ilk*_*chu 8

我认为你需要使用s///for&来工作,例如:

$ sed -e '/[a-z]/!s/.*/\L&/' < test.txt
One, Two.
OnE, Two.
one, two.
Run Code Online (Sandbox Code Playgroud)

您可以使用 Perl 执行相同或类似的操作(这可能在 GNU sed 不可用的情况下可用):

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

或者:

% perl -pe '$_ = lc if not /[[:lower:]]/' < test.txt
One, Two.
OnE, Two.
one, two.
Run Code Online (Sandbox Code Playgroud)


Gil*_*not 5

Perl的三元运算符:

$ perl -ne 'print /[a-z]/ ? $_ : lc' file
One, Two.
OnE, Two.
one, two.
Run Code Online (Sandbox Code Playgroud)

说明

操作员 意义
perl 可执行文件
-n 解析当前文件内容,就像我们使用while (<>) ...
-e Perl的e表达
print 打印
/regex/ ? : 三元运算符,基于布尔结果的匹配regex
/[a-z]/ 如果有小写匹配...
$_ ...然后打印当前行的当前默认变量$_
lc l...否则打印ower ase中的当前行c(隐式使用$_