grep中的正则表达式

grep

grep阅读手册页(重点是我的)

常规 表达式
       正则表达式是描述一组字符串的模式。
       通过使用各种运算符组合
       较小的表达式可以类似于算术表达式来构造正则表达式。grep理解正则表达式语法的三种不同版本:“基本”(BRE),
       “扩展”(ERE)和“ perl”(PCRE)。在GNU   grep
       ,基本语法和扩展语法之间的可用功能没有区别

        

再往下读

   重复
       的正则表达式可以由几个重复操作符之一:      上一项是可选的,最多匹配一次。
       *      前面的项目将被匹配零次或多次。
       +      前面的项目将被匹配一次或多次。
       { n }    前一项恰好匹配n次。
       { n ,}   前一项匹配n次或多次。
       {, m }   前一项最多匹配m次。这是一个GNU扩展。
       { n  m }
         前一项至少匹配n次,但不超过m次。

我想我正在使用GNU的grep,因为最后一行显示

User Commands                    GNU grep 2.16                         GREP(1)  

那么,为什么$ echo aa | grep a{2}在包括-E预期的工作时没有输出任何东西呢?

钢铁司机

这里的微妙之处在于,虽然功能上没有差异,但语法上有所不同特别是:

  • 在BRE中,{并且}是文字,除非进行转义,在这种情况下,它们表示量词表达式

然而

  • 在ERE,{}围量词除非他们逃了出来,在这种情况下,他们是文字。

所以

$ echo aa | grep 'a\{2\}'    # BRE
aa

$ echo aa | grep -E 'a{2}'   # ERE
aa

如果不将表达式括在引号中,则需要对反斜杠进行反斜杠转义,以防止外壳扩展它们:

$ echo aa | grep a\\{2\\}    # BRE
aa

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章