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

Curly Braces with {} grep and regular expressions: Why does it exceed the maximum value?

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

事情是这样的:

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 #

根据手册,情况并非如此,因为我在这里指定我只查找包含两个连续 o 到三个连续 o 的字符串。

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

19.4.10. between n and m times And here we demand exactly from minimum 2 to maximum 3 times.

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:~$

感谢所有回复的人。

# grep -E 'o{2,3}' reg_file2
lool
loool
loooose

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

我认为您实际要查找的命令是,

$ grep -P '(?<!o)o{2,3}(?!o)' file
lool
loool

解释:

  • (?<!o) 否定后视断言匹配不会以字母 o.

  • 开头
  • o{2,3} 匹配 2 或 3 个 o。

  • (?!o) 否定前瞻断言匹配后不会跟字母 o.

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

解释:

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

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

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

您不清楚正则表达式的工作原理。

grep 中的模式 o{2,3} 将遍历每一行以查找 ooooo,只要有匹配项,Grep 就会为您找到该行。由于您没有在模式中添加其他规则,因此您从 grep -E 'o{2,3}' reg_file2 得到的是正确的。

我想在你的情况下你只需要两个或三个连续的字母 'o's,因此你需要像 Raj 回答的那样使用正则表达式。匹配 ooooo 后既不跟字母 'o'.