sed去除所有大写字母

3
我尝试使用以下sed命令删除字符串中所有仅为大写字母的出现次数,但只输出我输入的字符串 - 我该如何正确执行替换?
echo "Dog boy Did Good" | sed 's/\([A-Z]\+\)/\1/g'
4个回答

7
echo "Dog boy Did Good" | sed 's/[A-Z]//g'

2
echo "Dog boy Did Good" | sed 's/[A-Z]//g'
og boy id ood

你可以用空白替换掉某些东西(大写字母),不需要分组,因为后面不再使用它,也不需要加上“+”号,因为结尾的“g”会全局进行替换。

1
如果你想完全删除它们,请不要在 sed 表达式的第二部分使用 \1,因为这会添加第一次匹配(也就是你要替换的内容)。

1

假设您所有的大写字母都是用 [A-Z] 表示的,这在美国英语中是标准的,那么您现在拥有的答案是很好的,但是未通过土耳其测试,因为土耳其语中有几个变体的字母 i

更好的方法是使用 [[:upper:]] 机制,它将尊重当前的 locale(7)

$ sed 's/[[:upper:]]//g' /etc/motd
elcome to buntu 11.04 (/inux 2.6.38-12-generic x86_64)
...

我想提出的另一种选择是 tr(1) 命令可以轻松地进行删除操作:

$ tr -d [[:upper:]] < /etc/motd 
elcome to buntu 11.04 (/inux 2.6.38-12-generic x86_64)
...

1
在德语中,针对 echo "Über Öko-Äpfel TNT" | sed 's/[A-Z]//g' 命令,我得到了结果 ber ko-pfel。使用的系统是 Ubuntu 10.04.3,LC_ALL=de_DE.utf8。 - user unknown
但我还记得那些时候,它并不是这样的 - 几年前的事情 :) - user unknown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接