我最近尝试使用 sed 从逗号和换行符分隔的枚举成员中生成一堆方法。我遇到了以下似乎不直观的行为:
$ echo 'Hello,' | sed 's/\(.*\),\?/"Hi \1!"/g'
"Hi Hello,!"
在这里,我试图通过 \(.*\)
将逗号之前的所有内容捕获到一个组中,然后我允许使用可选的逗号 ,\?
。我希望这会将 \1
替换为第一个逗号之前的所有内容,即 Hello
,但由于某种原因,逗号也被包含在替换中,尽管它不在团体。为什么会这样?
最佳答案
正则表达式默认进行贪婪匹配(从左到右),如果最贪婪的匹配不起作用则回溯。所以在 \(.*\),\?
的情况下,最贪婪的匹配是将 Hello,
匹配到 \(.*\)
而 ,\?
什么都没有。
我不确定如何在基本正则表达式(sed
使用的)中进行非贪婪匹配。在 Perl 风格的正则表达式中(sed
不使用),你在匹配运算符后面放一个问号,所以你会使用类似 (.*?),?
.
你可以做的下一个最好的事情是使用像 \([^,]*\),\?
这样的东西,但是它会在它看到的第一个逗号处停止匹配。
关于linux - 为什么sed会匹配组外的东西作为组的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42127851/