Grep {n}上一项完全匹配n次,对于“ Hair”,“ Haair”和“ Haaair”来说,我不清楚

时间:2019-06-09 17:45:07

标签: grep

假设有三个字符串“ Hair”,“ Haair”和“ Haaair”,当我使用grep -E'^ Ha {1}'时,它返回所有前三个单词,而我只期望“ Hair” ,正如我所要求的,返回以H开头并紧跟字母“ a”一次的行。

1 个答案:

答案 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}完全等同于HaHa{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进行替换将根本不处理任何字符。