我读过的很多文档都说以下命令应该匹配 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
在较长的x
s 运行中匹配 3 或 4 运行。为了防止这种情况发生,需要某种边界条件不是匹配较长运行的子集。具有grep
PCRE 支持的可以使用零宽度环视来实现此目的:
(echo xxx; echo xxxxxx) | grep -P '(?<!x)xxx(?!x)'