Sed转义特殊字符

时间:2019-03-15 16:49:38

标签: regex sed

要使sed与交替结构一起使用,我们必须对特殊字符(例如|sed -n "/\(abc\|def\)/p" )进行换行:

sed -n "/(abc|def)/p"

简单

float-right

不起作用。

我的问题是:为什么sed的行为与“正常”正则表达式相反,在这种情况下,我们转义了特殊字符以赋予其字面意思?

1 个答案:

答案 0 :(得分:1)

您所说的“正常”是Perl发明的功能。

所有传统的正则表达式引擎(例如grep,sed,emacs,awk所使用的引擎)都具有一些特殊字符,这些特殊字符在转义时会字面上匹配,而普通字符会在转义时具有特殊含义。对于发生这种情况的最好猜测就是进化:也许正则表达式的第一个实现仅支持[]*,而其他所有东西都在字面上匹配。为了在保持兼容性的同时引入新功能,发明了转义语法(\(\)等)。

后来,其他工具只是复制了现有语法。

据我所知,Perl是第一种使正则表达式语法更加完善的语言,

  • 所有字母数字字符都匹配。
  • 转义字母数字字符可能具有特殊含义(例如\n\1\z)。
  • 标点符号可能有特殊含义(例如(+?)。
  • 转义一个非字母数字的字符总是使它在字面上匹配,即使它在一开始并不特殊(例如\:\")。

所有“现代”正则表达式引擎(例如JavaScript或.NET中使用的正则表达式引擎)都复制了Perl的行为。