阅读的手册页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 \).