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)上,它仍然是旧的方式,据我所知.不幸的是,这是一个真正的混乱,因为现在很难知道哪一个使用.
感谢摇滚乐队,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.
转义括号(\()使正则表达式搜索括号作为表达式的一部分.
非转义括号(()使正则表达式组成为括号内容.
换句话说,如果你逃避它们,引擎会查找它们,但是如果你保持原样,它们会使引擎将结果分组为变量.
举例说明:
$myString = "junk(150)moar";
要得到这个数字:
#^\w+\((\d+)\)\w+$#
($1是150)
我知道,这是一团糟,但它演示了使用分组括号和括号作为匹配表达式的一部分.
正如用户@bmk正确指出的那样,这个答案适用于扩展正则表达式,但不适用于基本正则表达式.在大多数编程语言等中,很难找到基本正则表达式作为默认解析引擎,但在假设此答案适用于您的情况之前,验证您使用的引擎是明智的.
| 归档时间: |
|
| 查看次数: |
23586 次 |
| 最近记录: |