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

1 grep regular-expression

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

grep -E {x}\{3,4}
Run Code Online (Sandbox Code Playgroud)

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

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

xxxxx
xxxxxx
Run Code Online (Sandbox Code Playgroud)

但是我创建了一个完全相同的测试文件并运行此命令

grep -o -E [x]\{3,4} testfile
Run Code Online (Sandbox Code Playgroud)

返回此输出:

xxxx
xxxx
Run Code Online (Sandbox Code Playgroud)

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

thr*_*rig 6

首先,你应该总是引用 grep 表达式,因为试图记住 shell 用什么特殊字符做什么是很痛苦的:

grep -o -E '[x]{3,4}' testfile
Run Code Online (Sandbox Code Playgroud)

其次,grep会找到一个最小的匹配,就像那样很容易,所以会很高兴地x在更长的xs 中匹配 3 或 4 次运行。为了防止这种情况,需要某种边界条件来匹配较长运行的子集。grep支持 PCRE 的A可以使用零宽度环视来实现这一点:

(echo xxx; echo xxxxxx) | grep -P '(?<!x)xxx(?!x)'
Run Code Online (Sandbox Code Playgroud)