grep caret 似乎没有效果

JW0*_*W01 7 grep regular-expression

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

但是,当我使用它时,grep它的行为出乎意料。

我在Ubuntu 10.04 Lucid Lynx上使用GNU grep 2.5.4

我回显一行'你好',然后将它传送grep到搜索“零个或多个空白字符后跟字母h ”的a:

echo ' hello' | grep -E '[:space:]*h'
hello
Run Code Online (Sandbox Code Playgroud)

grep 觉得没问题。

如果我添加一个插入符号来表示我只希望模式匹配“零个或多个空白字符,后跟字符串开头的字母h ”:

echo ' hello' | grep -E '^[:space:]*h'
Run Code Online (Sandbox Code Playgroud)

未找到匹配项。我希望字符串匹配,因为它以空格开头,后跟h

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

Sha*_*off 7

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

要解释为什么您当前的失败:

就目前而言,[:space:]*h包括一个字符类,查找任何字符::, s, p, a, c, 并且e出现任意次数(包括 0),后跟h. 这与您的字符串匹配得很好,但是如果您运行grep -o,您会发现您只匹配了h,而不是空格。

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