grep 中的正则表达式

grep 中的正则表达式

阅读的手册页grep(强调我的)

常规的 表达方式
       正则表达式是描述一组字符串的模式。正则表达式是
       类似于算术表达式,通过使用各种运算符来组合
       较小的表达式。

       grep理解正则表达式语法的三种不同版本:“基本”(BRE)、
       “扩展”(ERE)和“perl”(PCRE)。在 GNU 中  grep 可用的情况没有区别
       基本语法和扩展语法之间的功能

再往下写着

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

我想我正在使用 GNU 的 grep 因为最后一行是

User Commands                    GNU grep 2.16                         GREP(1)  

那么,为什么在包含按预期工作$ echo aa | grep a{2}时无法输出任何内容呢?-E

答案1

这里的微妙之处在于,虽然没有区别功能性, 那里的差异句法。尤其:

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

然而

  • 在 ERE 中,{并且}将量词括起来,除非它们被转义,在这种情况下它们是字面量。

所以

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

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

如果您没有将表达式括在引号中,则需要对反斜杠进行反斜杠转义以防止 shell 展开它们:

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

答案2

请参阅手册页下面的部分

基本正则表达式与扩展正则表达式

   In basic regular expressions the meta-characters ?, +, {, |, (, and )
   lose their special meaning; instead use the backslashed versions \?,
   \+, \{, \|, \(, and \).

相关内容