在grep中使用转义字符

时间:2009-03-25 18:50:27

标签: regex escaping

我有以下正则表达式来消除空格,制表符和新行:[^ \n\t]

但是,我想针对某些其他字符展开此功能,例如><

我尝试[^ \n\t<>],现在效果很好,但如果<>前面有\,我希望表达式不匹配。

我尝试[^ \n\t[^\\]<[^\\]>],但这不起作用。

3 个答案:

答案 0 :(得分:4)

以下任何一个序列都可以出现在您的输入中吗?

  

\\>
  \\\>
  \\\\>
  \ blank
  \ tab
  \ newline
  ...

如果是这样,您如何建议对待它们?

如果没有,那么只要您的正则表达式引擎支持它,zero-width look-behind assertions就可以完成。任何支持Perl风格的正则表达式(包括Perl,PHP等)的引擎都会出现这种情况:

 (?<!\\)[ \n\t<>]

以上内容将匹配任何未转义的空格,换行符,制表符或带角度的大括号。更一般地说(使用\s表示任何空格字符,包括\r):

 (?<!\\)\s

或者,使用补充表示法而不需要零宽度的后视断言(但可以说效率较低):

 (?:[^ \n\t<>]|\\[<>])

您也可以使用后者的变体来处理\\>\\\>\\\\>等情况以及一些有限数量的前面反斜杠,例如:< / p>

 (?:[^ \n\t<>]|(?:^|[^<>])[\\]{1,3,5,7,9}[<>])

答案 1 :(得分:0)

根据the grep man page

  

括号表达式是列表   由[和]括起来的字符。它   匹配其中的任何单个字符   列表;如果是第一个字符   list是插入符号^然后它匹配   任何不在列表中的字符。

这意味着您无法匹配一系列字符,例如\&lt;或\ \>只有一个字符。

除非你有一个使用Perl正则表达式支持构建的grep版本,否则你可以使用像所提到的其他海报之类的外观。并非所有版本的grep都有此支持。

答案 2 :(得分:-1)

也许你可以使用egrep并将你的模式字符串放在引号内。这应该消除了逃避的必要性。