grep caret 似乎没有效果

grep caret 似乎没有效果

我的印象是插入符号的意思是“行的开头" 带有扩展 POSIX 正则表达式。

然而,当我使用它时,grep它的行为却出乎意料。

我在用GNU grep 2.5.4Ubuntu 10.04 清醒山猫

我回显一句‘你好',然后将其通过管道传输到grep搜索“零个或多个空白字符,后跟字母H”:

echo ' hello' | grep -E '[:space:]*h'
hello

grep发现还可以。

如果我添加插入符号来表明我只想匹配模式“零个或多个空白字符,后跟字母H在字符串的开头”:

echo ' hello' | grep -E '^[:space:]*h'

未找到匹配项。我希望该字符串能够匹配,因为它以空白其次是H

为什么这个插入符号会阻止匹配?

答案1

要找到一个空格,您必须[:space:]在另一对括号内使用,它看起来像[[:space:]]。你可能想表达grep -E '^[[:space:]]*h'

解释一下为什么你当前的失败:

按照目前的情况,[:space:]*h包括一个字符类,用于查找任意字符::sp、 、ac和 ,e其中出现任意次数(包括 0 次),后跟h。这与您的字符串匹配得很好,但是如果您运行grep -o,您会发现您只匹配了h,而不匹配空格。

如果在开头添加一克拉,则这些字母 或 中的一个h必须位于字符串的开头才能匹配,但没有一个位于字符串的开头,因此它不匹配。

答案2

看起来它假设[:space:]只会出现在括号表达式中(用 * 突出显示匹配项):

echo 'hello' | grep -E '^[:space:]*h'
*h*ello
echo 'hello' | grep -E '[^[:space:]]*h'
*h*ello
echo ' hello' | grep -E '^[[:space:]]*h'
* h*ello

以下片段man grep(我的突出显示)对此进行了解释:

最后,预定义了某些命名的字符类别括号内的表达式[...] 请注意,这些类名称中的括号是符号名称的一部分,并且除括号外还必须包含定界括号表达式。

相关内容