我的印象是插入符号的意思是“行的开头" 带有扩展 POSIX 正则表达式。
然而,当我使用它时,grep
它的行为却出乎意料。
我在用GNU grep
2.5.4在Ubuntu 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
包括一个字符类,用于查找任意字符::
、s
、p
、 、a
、c
和 ,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
(我的突出显示)对此进行了解释:
最后,预定义了某些命名的字符类别括号内的表达式[...] 请注意,这些类名称中的括号是符号名称的一部分,并且除括号外还必须包含定界括号表达式。