sed是否匹配第一个字符?

时间:2017-10-10 00:40:09

标签: regex sed

尝试了解有关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

1 个答案:

答案 0 :(得分:5)

问题1

问题是为什么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

问题2

同样,问题是为什么在这个命令中没有重复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