Qual é a diferença entre \ b e \ no comando grep?

5

Na página man de grep , vejo

The symbols \< and \> respectively match the empty string at the beginning and  
end of a word.  The symbol \b matches the  empty  string at  the  edge  of  a  word.

Mas ainda não consigo descobrir a diferença. Para mim, \b é a notação de Perl para o limite de palavras, enquanto \< é a notação de Vim para o mesmo propósito.
PS: Inglês não é minha língua nativa. Perdoe-me se a diferença é óbvia para você.

    
por duleshi 27.03.2014 / 10:36

2 respostas

8

\< corresponde ao início de uma palavra
\> corresponde ao final de uma palavra
\b corresponde a ambas as fronteiras se no final ou no início

O importante sobre esses caracteres especiais é que eles combinam com uma string vazia e não com o próprio limite da palavra. um limite de palavra sendo o contrário do conjunto de caracteres representado por \w equivalente de [_[:alnum:]] (letra a a Z, dígitos e _ ) na notação Posix.

Exemplo

Finalmente, Graeme encontre um exemplo muito interessante :

$ echo 'acegi   z' | grep -o '[acegi ]*\>' | cat -A
acegi$
$ echo 'acegi   z' | grep -o '[acegi ]*\b' | cat -A
acegi   $ 

Atualmente, este exemplo mostra que pode ser útil às vezes corresponder precisamente ao final da palavra, em vez de um limite de palavra, porque o uso do caractere de espaço correspondente é evitado pela correspondência do final da palavra.
Então, em um exemplo mais útil, eu diria que se você quiser combinar caracteres que não sejam palavras e o final desta não palavra, você não pode usar \> ; mas talvez \b possa ser usado neste caso em particular porque ele corresponderá ao início da próxima palavra.

Até agora, nenhum exemplo conseguiu chegar à minha mente. Mas na minha opinião, provavelmente há alguns casos de uso em que faz sentido, mas meu palpite é que é apenas para fins de legibilidade, porque quando você coloca \b é vago, mas se você precisa iniciar ou terminar a palavra, então dá um melhor compreensão do regexp para as pessoas que o lêem.

    
por 27.03.2014 / 10:43
1

Para responder à pergunta sobre o seu título?

What's the difference between \b and \< ...

Quase nenhum. Ambos combinam com o limite , a transição entre uma palavra e uma não palavra.

A única diferença técnica é:

  • O \b corresponde ao limite em ambos início e fim de uma palavra.
  • O \< corresponde apenas ao início de uma palavra.
  • O '>' corresponde apenas ao end de uma palavra.

A diferença prática é:

$ echo ',,abc...' | grep -o '[abc.,]*'
,,abc...                                   # match the whole string

$ echo ',,abc...' | grep -o '[abc.,]*\b'
,,abc                                      # to the rightmost (due to *) word boundary.

$ echo ',,abc...' | grep -o '[abc.,]*\>'
,,abc                                      # match to the same point (in this case).

$ echo ',,abc...' | grep -o '[abc.,]*\<'   
,,                                         # match to the rightmost **start** of a word.

O mesmo pode ser feito com espaços (cat adicionado para revelar os espaços):

Até o "limite de palavras" mais à direita (qualquer um) (observe os espaços):

$ echo 'abcd     abcd    Z' | grep -o '[a-z ]*\b' | cat -A
abcd     abcd    $

Até o "início de palavra" mais à direita (mesmo ponto):

$ echo 'abcd     abcd    Z' | grep -o '[a-z ]*\<' | cat -A
abcd     abcd    $

Até o final da palavra "à direita" (sem espaço à direita):

$ echo 'abcd     abcd    Z' | grep -o '[a-z ]*\>' | cat -A
abcd     abcd$

Ou com sed:

Quatro limites de palavras:

$ echo "abc %-= def." | sed 's/\b/ |>X<| /g'
 |>X<| abc |>X<|  %-=  |>X<| def |>X<| .

Dois começos da palavra:

$ echo "abc %-= def." | sed 's/\</ |>X<| /g'
 |>X<| abc %-=  |>X<| def.

E dois finais da palavra:

$ echo "abc %-= def." | sed 's/\>/ |>X<| /g'
abc |>X<|  %-= def |>X<| .

Referência

Do GNU info sed:

'\b'
Matches a word boundary; that is it matches if the character to the left is a "word" character and the character to the right is a "non-word" character, or vice-versa.

     $ echo "abc %-= def." | sed 's/\b/X/g'
     XabcX %-= XdefX.

Começando

'\<' Matches the beginning of a word.

     $ echo "abc %-= def." | sed 's/\</X/g'
     Xabc %-= Xdef.

Fim

'>' Matches the end of a word.

     $ echo "abc %-= def." | sed 's/\>/X/g'
     abcX %-= defX.
    
por 25.10.2018 / 21:18