试图了解有关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
Run Code Online (Sandbox Code Playgroud)
我对前两个例子感到很困惑.他们为什么不匹配123并复制它,输出abc 123 123?
问题是为什么123不重复:
$ echo "abc 123" | sed 's/[0-9]*/& &/'
abc 123
Run Code Online (Sandbox Code Playgroud)
为了答案,请注意:
$ echo "abc 123" | sed 's/[0-9]*/&#&/'
#abc 123
Run Code Online (Sandbox Code Playgroud)
会发生什么是[0-9]*匹配行开头的零长度字符串.
如果我们g为全局替换添加标志,那么,与许多零长度字符串一起,重复123:
$ echo "abc 123" | sed 's/[0-9]*/&#&/g'
#a#b#c# 123#123
Run Code Online (Sandbox Code Playgroud)
同样,问题是为什么在这个命令中没有重复123:
$ echo "abc 123" | sed 's/[0-9]+/& &/'
abc 123
Run Code Online (Sandbox Code Playgroud)
答案是,在默认的基本正则表达式中,+不是活动字符.要使其处于活动状态(仅限GNU sed),需要对其进行转义:
$ echo "abc 123" | sed 's/[0-9]\+/& &/'
abc 123 123
Run Code Online (Sandbox Code Playgroud)
或者,我们可以使用扩展正则表达式,在这种情况下,plain +是活动的:
$ echo "abc 123" | sed -E 's/[0-9]+/& &/'
abc 123 123
Run Code Online (Sandbox Code Playgroud)
兼容性注意:对于旧版本的GNU sed,请使用-r代替-E.