grep caret parece não ter efeito

7

Fiquei com a impressão de que um símbolo de circunflexo significa " início da linha " com expressões regulares POSIX estendidas.

No entanto, quando eu uso com grep , ele se comporta inesperadamente.

Estou usando o GNU grep 2.5.4 no Ubuntu 10.04 Lucid Lynx .

Eu echo uma linha ' hello ', depois canalizo para um grep que procura por " zero ou mais caracteres em branco, seguidos pela letra h ":

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

grep acha tudo ok.

Se eu adicionar um acento circunflexo para indicar que desejo apenas que o padrão corresponda a " zero ou mais caracteres em branco, seguidos da letra h no início da string ":

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

Nenhuma correspondência foi encontrada. Espero que a string tenha correspondido porque começa com espaço em branco seguido por h .

Por que esse símbolo de acento circunflexo impede uma correspondência?

    
por JW01 28.10.2011 / 12:42

2 respostas

7

Para encontrar um espaço, você precisa usar [:space:] dentro de outro par de colchetes, que será parecido com [[:space:]] . Você provavelmente quis expressar grep -E '^[[:space:]]*h'

Para explicar por que seu atual falha:

Como está, [:space:]*h inclui uma classe de caracteres à procura de qualquer um dos caracteres: : , s , p , a , c e e que ocorrem em qualquer número de vezes (incluindo 0), seguido por h . Isso corresponde muito bem à sua string, mas se você executar grep -o , verá que correspondeu apenas a h , não o espaço.

Se você adicionar um quilate ao início, uma dessas letras ou h deve estar no início da string para corresponder, mas nenhuma é, portanto, não corresponde.

    
por 28.10.2011 / 13:21
4

Parece que o [:space:] aparecerá apenas em uma expressão de colchetes (correspondências destacadas com *):

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

Isso é explicado pelo seguinte trecho de man grep (meu destaque):

Finally, certain named classes of characters are predefined within bracket expressions [...] Note that the brackets in these class names are part of the symbolic names, and must be included in addition to the brackets delimiting the bracket expression.

    
por 28.10.2011 / 13:01