要使sed与交替结构一起使用,我们必须对特殊字符(例如|
或sed -n "/\(abc\|def\)/p"
)进行换行:
sed -n "/(abc|def)/p"
简单
float-right
不起作用。
我的问题是:为什么sed的行为与“正常”正则表达式相反,在这种情况下,我们转义了特殊字符以赋予其字面意思?
答案 0 :(得分:1)
您所说的“正常”是Perl发明的功能。
所有传统的正则表达式引擎(例如grep,sed,emacs,awk所使用的引擎)都具有一些特殊字符,这些特殊字符在转义时会字面上匹配,而普通字符会在转义时具有特殊含义。对于发生这种情况的最好猜测就是进化:也许正则表达式的第一个实现仅支持[
,]
和*
,而其他所有东西都在字面上匹配。为了在保持兼容性的同时引入新功能,发明了转义语法(\(
,\)
等)。
后来,其他工具只是复制了现有语法。
据我所知,Perl是第一种使正则表达式语法更加完善的语言,
\n
,\1
,\z
)。(
,+
,?
)。\:
,\"
)。所有“现代”正则表达式引擎(例如JavaScript或.NET中使用的正则表达式引擎)都复制了Perl的行为。