带有{} grep和正则表达式的卷曲大括号:为什么它超过最大值?

use*_*164 1 regex linux bash grep curly-braces

我已经有一段时间自学shell脚本了,我遇到了关于grep和花括号{}的Linux基础知识手册的这一部分.我的问题是,当我要求使用{}或花括号从最小到最大出现次数搜索字符串模式时,我的结果超出了我指定的最大值.

这是发生了什么:

Express11:~/unix_training/reg_ex # cat reg_file2
ll
lol
lool
loool
loooose
Express11:~/unix_training/reg_ex # grep -E 'o{2,3}' reg_file2
lool
loool
loooose
Express11:~/unix_training/reg_ex #
Run Code Online (Sandbox Code Playgroud)

根据手册,不应该是这样的情况,因为我在这里指定我只查找包含两个连续o到三个连续o的字符串.

编辑:实际上,我不理解花括号如何工作的原因是因为手册的这种简单的解释.我引述:

19.4.10.在n和m次之间这里我们要求从最小2到最多3次.

paul@debian7:~$ cat list2
ll
lol
lool
loool
paul@debian7:~$ grep -E 'o{2,3}' list2
lool
loool
paul@debian7:~$ grep 'o\{2,3\}' list2
lool
loool
paul@debian7:~$ cat list2 | sed 's/o\{2,3\}/A/'
ll
lol
lAl
lAl
paul@debian7:~$
Run Code Online (Sandbox Code Playgroud)

感谢所有回复的人.

Avi*_*Raj 5

# grep -E 'o{2,3}' reg_file2
lool
loool
loooose
Run Code Online (Sandbox Code Playgroud)

命令完美地运行,它匹配最后一行中的前三个o.这就是为什么你在最终输出中得到最后一行的原因.

我认为你真正想要的命令是,

$ grep -P '(?<!o)o{2,3}(?!o)' file
lool
loool
Run Code Online (Sandbox Code Playgroud)

说明:

  • (?<!o)负面的lookbehind声称匹配不会以字母开头o.

  • o{2,3} 匹配2或3 o.

  • (?!o)否定前瞻声称匹配将不会跟随该字母o.

要么

$ grep -E '(^|[^o])o{2,3}($|[^o])' file
lool
loool
Run Code Online (Sandbox Code Playgroud)

说明:

  • (^|[^o])匹配一行^或任何字符的开头但不匹配o

  • o{2,3} 匹配2或3 o

  • ($|[^o])匹配行的结尾$或任何字符但不匹配o