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)
我认为你需要使用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)
与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 (隐式使用$_ ) |