假设有三个字符串“ Hair”,“ Haair”和“ Haaair”,当我使用grep -E'^ Ha {1}'时,它返回所有前三个单词,而我只期望“ Hair” ,正如我所要求的,返回以H开头并紧跟字母“ a”一次的行。
答案 0 :(得分:1)
grep
不会检查其输入是否与给定的搜索表达式匹配。 Grep会找到与搜索匹配的输入的子字符串。
请参阅:
grep test <<< This is a test.
输入与test
不完全匹配。输入中只有 part 个匹配项,
This is a test.
但这足以让grep
输出整行。
类似地,当你说
grep -E '^Ha{1}' <<< Haaair
输入与搜索不完全匹配,但其中一部分匹配
Haaair
就足够了。请注意,{n,m}
语法纯粹是一种方便:Ha{1}
完全等同于Ha
,Ha{3,}
是Haaa+
,Ha{2,5}
是{{1} }是Haa(a?){3}
等。换句话说,Haaa?a?a?
并不意味着“恰好一次”,而只是意味着“一次”。
您想要做的是匹配一个{1}
,后面没有另一个Ha
。您有两种选择:
如果您的a
支持PCRE,则可以使用否定前瞻:
grep
grep -P '^Ha(?!a)'
是一个零长度的断言,类似于(?!a)
。它不匹配任何字符;如果第一个后面有^
,只会导致匹配失败。
或者,您可以使其简单并使用否定的a
:
[]
在grep -E '^Ha([^a]|$)'
匹配任何非[^a]
的单个字符的情况下,用a
进行替换将根本不处理任何字符。