【发布时间】:2011-12-08 07:47:34
【问题描述】:
我正在尝试使用下面的 sed 命令仅在以下字符串中删除所有出现的大写字母,但它只输出我输入的字符串 - 如何正确放置替换?
echo "Dog boy Did Good" | sed 's/\([A-Z]\+\)/\1/g'
【问题讨论】:
我正在尝试使用下面的 sed 命令仅在以下字符串中删除所有出现的大写字母,但它只输出我输入的字符串 - 如何正确放置替换?
echo "Dog boy Did Good" | sed 's/\([A-Z]\+\)/\1/g'
【问题讨论】:
echo "Dog boy Did Good" | sed 's/[A-Z]//g'
【讨论】:
echo "Dog boy Did Good" | sed 's/[A-Z]//g'
og boy id ood
你用什么东西(大写)替换一些东西,你不需要对它分组,因为你以后不用它,你也不需要+,因为最后 g 全局执行替换。
【讨论】:
如果您想完全删除它们,请不要在 sed 表达式的后半部分使用 \1,因为这会添加到第一个匹配项(这是您要替换的内容)
【讨论】:
你现在得到的答案很好,假设你所有的大写字母都用[A-Z]表示,这是常规美式英语的标准,但是fails the Turkey test,它有几个字母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)
...
【讨论】:
echo "Über Öko-Äpfel TNT" | sed 's/[A-Z]//g' 的结果ber ko-pfel。 Übüntü 10.04.3,LC_ALL=de_DE.utf8