我读过的很多文档都说以下命令应该匹配 x 至少连续出现 3 次但连续出现不超过 4 次的行:
grep -E {x}\{3,4}
Run Code Online (Sandbox Code Playgroud)
例如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
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 中。
首先,你应该总是引用 grep 表达式,因为试图记住 shell 用什么特殊字符做什么是很痛苦的:
grep -o -E '[x]{3,4}' testfile
Run Code Online (Sandbox Code Playgroud)
其次,grep
会找到一个最小的匹配,就像那样很容易,所以会很高兴地x
在更长的x
s 中匹配 3 或 4 次运行。为了防止这种情况,需要某种边界条件来不匹配较长运行的子集。grep
支持 PCRE 的A可以使用零宽度环视来实现这一点:
(echo xxx; echo xxxxxx) | grep -P '(?<!x)xxx(?!x)'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
231 次 |
最近记录: |