grep -E 正则表达式语法改变了吗?

grep -E 正则表达式语法改变了吗?

我读过的很多文档都说以下命令应该匹配 x 连续出现至少 3 次但连续不超过 4 次的行:

grep -E {x}\{3,4}

例如http://www.delorie.com/gnu/docs/grep/grep_7.html或者http://www.google.com/support/enterprise/static/postini/docs/admin/en/admin_ee_cu/cm_regex.html

据推测,这意味着这应该不返回任何匹配项:

xxxxx
xxxxxx

但我创建了一个测试文件,并运行这个命令

grep -o -E [x]\{3,4} testfile

返回了这个输出:

xxxx
xxxx

它匹配两条线。这是怎么回事?这是 Solaris 上的 bash shell 中的内容。

答案1

首先,您应该始终引用 grep 表达式,因为试图记住 shell 对哪些特殊字符执行什么操作是一件痛苦的事情:

grep -o -E '[x]{3,4}' testfile

其次,grep会找到一个最小匹配,就这么简单,所以会很高兴x在较长的xs 运行中匹配 3 或 4 运行。为了防止这种情况发生,需要某种边界条件不是匹配较长运行的子集。具有grepPCRE 支持的可以使用零宽度环视来实现此目的:

(echo xxx; echo xxxxxx) | grep -P '(?<!x)xxx(?!x)'

相关内容