带{} 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}
将遍历每一行以查找 oo
和 ooo
,只要有匹配项,Grep 就会为您找到该行。由于您没有在模式中添加其他规则,因此您从 grep -E 'o{2,3}' reg_file2
得到的是正确的。
我想在你的情况下你只需要两个或三个连续的字母 'o's,因此你需要像 Raj 回答的那样使用正则表达式。匹配 oo
或 ooo
后既不跟字母 'o'.
我自学 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}
将遍历每一行以查找 oo
和 ooo
,只要有匹配项,Grep 就会为您找到该行。由于您没有在模式中添加其他规则,因此您从 grep -E 'o{2,3}' reg_file2
得到的是正确的。
我想在你的情况下你只需要两个或三个连续的字母 'o's,因此你需要像 Raj 回答的那样使用正则表达式。匹配 oo
或 ooo
后既不跟字母 'o'.