尝试了解有关sed的更多信息,我尝试了以下示例:
○ → echo "four three two one" | sed 's/one/ONE/'
four three two ONE
○ → echo "abc 123" | sed 's/abc/& &/'
abc abc 123
○ → echo "abc 123" | sed 's/123/& &/'
abc 123 123
○ → echo "123 abc" | sed 's/[0-9]*/& &/'
123 123 abc
○ → echo "abc 123" | sed 's/[0-9]*/& &/'
abc 123
○ → echo "abc 123" | sed 's/[0-9]+/& &/'
abc 123
我对最后两个例子非常困惑。为什么他们不匹配123
并将其复制,输出abc 123 123
?
答案 0 :(得分:5)
问题是为什么123不重复:
$ echo "abc 123" | sed 's/[0-9]*/& &/'
abc 123
答案是:
$ echo "abc 123" | sed 's/[0-9]*/&#&/'
#abc 123
[0-9]*
匹配行开头的零长度字符串。
如果我们为全局替换添加g
标志,那么,以及许多零长度字符串,123是重复的:
$ echo "abc 123" | sed 's/[0-9]*/&#&/g'
#a#b#c# 123#123
同样,问题是为什么在这个命令中没有重复123:
$ echo "abc 123" | sed 's/[0-9]+/& &/'
abc 123
答案是,在默认的基本正则表达式中,+
不是活动字符。要使其处于活动状态(仅限GNU sed),需要对其进行转义:
$ echo "abc 123" | sed 's/[0-9]\+/& &/'
abc 123 123
或者,我们可以使用扩展正则表达式,在这种情况下,普通+
处于活动状态:
$ echo "abc 123" | sed -E 's/[0-9]+/& &/'
abc 123 123
兼容性注意:对于旧版本的GNU sed,请使用-r
代替-E
。