linux - 为什么sed会匹配组外的东西作为组的一部分?

标签 linux bash unix sed terminal

我最近尝试使用 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/

相关文章:

linux - CentOS 6 VNC 服务器拒绝连接

linux - 如何在 bash 中将文件内容连接到单个文件中?

c - getenv() Linux/Ubuntu 返回 NULL

linux - 在日期中包含点的现有日期中添加 1 天

linux - 如何在 linux/flatpak 上从 Monodevelop 启动 doxygen/perl?

linux - GNU netcat 退出代码总是 1?

linux - 如何删除第二列中的值出现特定次数的文件的行?

c - 在套接字 C 中发送字符串?

linux - AWK 将月份从日期解析为变量

regex - 尝试使用 BASH 删除段落中的重复项