这是我正在使用的文件:
Shane有点打球 小的 愚蠢的
当我使用
egrep 's.*l' new
Run Code Online (Sandbox Code Playgroud)
我得到的输出为
沙恩有点爱打球 小的 傻丫头
当我使用
egrep 's.*?l' new
Run Code Online (Sandbox Code Playgroud)
我得到与上面相同的输出,但它应该是不同的。
尽管您说“它应该有所不同”,但您忽略了您期望的输出。据我所知,?正则表达式中的可能解释是:
在基本正则表达式 (BRE) 中,?是字面问号;由于您的输入不包含此类字符,因此输出grep 's.*?l' new将为空。
在扩展正则表达式 (ERE) 中,?是一个量词,表示零或前一个正则表达式原子之一。在这种情况下,.*?是指“零个或多个单个字符(.*),重复零次或一次(?)” -这是等同于.*,并因此egrep 's.*?l'而egrep 's.*l'将产生相同的输出。
在perl 兼容的正则表达式 (PCRE) 中,?是一个贪婪修饰符,这样.*?ins.*?l匹配和之间的最短字符序列,而贪婪匹配最长的这样的序列。因此sls.*l
$ grep -P 's.*?l' new
Shane is a little to play ball
^^^^^
Run Code Online (Sandbox Code Playgroud)
尽管
$ grep -E 's.*?l' new
Shane is a little to play ball
^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)对于简单的情况,您可以?通过使用否定字符集,即在没有 PCRE修饰符的情况下实现“懒惰”
grep 's[^l]*l' new
Run Code Online (Sandbox Code Playgroud)
将匹配s后跟任何字符,除了 l, 后跟l.
旁白:egrep在技术上已弃用 - 您应该养成将 use plaingrep用于 BRE、grep -EERE 和grep -PPCRE的习惯。