是否使用GNU sed在正则表达式中转义(和)

gro*_*k12 20 regex bash gnu sed

我注意到这个网站上有几个帖子说用gnu sed你应该使用()正则表达式而不是\(\).但后来我查看了gnu sed手册,看到他们指定了这个\(并且\)必须使用.这是怎么回事?

mur*_*d99 24

您链接的gnu sed手册的这一部分解释了您是否应该转义括号取决于您使用的是基本正则表达式还是扩展正则表达式.这部分说明-r标志决定了你的模式.

编辑:如grok12的评论中所述-E,bsd sed中的-r标志执行标志在gnu sed中的操作.


chr*_*ney 15

最初sed,像grep和其他一切,使用\(表示分组,而(只是匹配一个字面的开放式paren.

许多正则表达式的新实现,包括egrep和perl,都改变了这种情况,所以\(意思是一个文字的开放式,并且(用于指定分组).

所以现在使用gnu sed,(是一个特殊的角色;就像egrep.但在其他系统(例如BSD)上,它仍然是旧的方式,据我所知.不幸的是,这是一个真正的混乱,因为现在很难知道哪一个使用.

  • 关于“所以现在使用 gnu sed,(是一个特殊字符;就像 egrep 一样” - 这似乎并非如此,至少在我的 gnu sed 版本(Ubuntu 12.04,sed 版本 4.2.1)上。默认是仍然“基本正则表达式”beaning `()` 被逐字解释。我需要 `-r` 来启用扩展模式。 (2认同)

gro*_*k12 9

感谢摇滚乐队,murga和克里斯.你们每个人都帮我理解了这个问题.我在这里回答我自己的问题,以便(希望)把整个故事放在一个地方.

使用的sed有两个主要版本:gnu和bsd.它们都需要基本正则表达式中的parens在用于分组时进行转义,但在扩展正则表达式中使用时不会转义.他们的不同之处在于-r选项为gnu启用了扩展的正则表达式,但-E对bsd启用了.

mac OSX中的标准sed是bsd.我相信世界其他地方的很多人都使用gnu sed作为标准,但我不知道究竟是谁使用了什么.如果您不确定自己使用的是什么,请尝试:

> sed -r
Run Code Online (Sandbox Code Playgroud)

如果你得到了

> sed: illegal option -- r
Run Code Online (Sandbox Code Playgroud)

回复然后你有bsd.


roc*_*est 5

转义括号(\()使正则表达式搜索括号作为表达式的一部分.

非转义括号(()使正则表达式组成为括号内容.

换句话说,如果你逃避它们,引擎会查找它们,但是如果你保持原样,它们会使引擎将结果分组为变量.

举例说明:

$myString = "junk(150)moar";

要得到这个数字:
#^\w+\((\d+)\)\w+$#

($1150)

我知道,这是一团糟,但它演示了使用分组括号和括号作为匹配表达式的一部分.

几年后更新:

正如用户@bmk正确指出的那样,这个答案适用于扩展正则表达式,但不适用于基本正则表达式.在大多数编程语言等中,很难找到基本正则表达式作为默认解析引擎,但在假设此答案适用于您的情况之前,验证您使用的引擎是明智的.

  • @ grok12:实际上,对于扩展的正则表达式而言,答案是正确的,但对于基本正则表达式则不然...... (5认同)