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次.
Run Code Online (Sandbox Code Playgroud)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
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