![Referência](https://rvso.com/image/52094/Refer%C3%AAncia.png)
Na página de manual do 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 do Perl para limite de palavras, enquanto \<
é a notação do Vim para o mesmo propósito.
PS: Inglês não é minha língua nativa. Perdoe-me se a diferença é óbvia para você.
Responder1
\<
corresponde ao início de uma palavra
\>
corresponde ao final de uma palavra
\b
corresponde a ambos os limites se estiver no final ou no início
O importante sobre esses caracteres especiais é que eles correspondem a uma string vazia e não ao limite da palavra em si. um limite de palavra sendo o contrário do conjunto de caracteres representado pelo \w
equivalente de [_[:alnum:]]
(letra a a Z, dígitos e _
) na notação Posix.
Exemplo
Finalmente,Graeme encontrou 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 às vezes pode ser útil corresponder precisamente o 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 um caractere que não seja de palavra e o final dessa não-palavra, não poderá usar \>
; mas talvez \b
possa ser usado neste caso específico porque corresponderá ao início da próxima palavra.
Até agora nenhum exemplo conseguiu chegar à minha mente. Mas, na minha opinião, provavelmente existem alguns casos de uso em que isso faz sentido, mas meu palpite é que é apenas para fins de legibilidade, porque quando você coloca \b
é vago, mas se você precisa o início ou o final da palavra, isso dá uma melhor compreensão de o regexp para as pessoas que o lêem.
Responder2
Para responder à pergunta sobre o seu título?
Qual é a diferença entre
\b
e\<
...
Quase nenhum. Ambos correspondem aolimite, a transição entre uma palavra e uma não palavra.
A únicatécnicodiferença é:
- A
\b
correspondência com o limite emambosinício e fim de uma palavra. - A
\<
única correspondênciacomeçarde uma palavra. - A
\>
única correspondênciafimde uma palavra.
Opráticodiferença é:
$ 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 poderia ser feito com espaços (gato adicionado para revelar os espaços):
Até o "limite de palavra" mais à direita (qualquer) (observe os espaços):
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\b' | cat -A
abcd abcd $
Até o "início da palavra" mais à direita (mesmo ponto):
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\<' | cat -A
abcd abcd $
Até o "fim da palavra" mais à direita (sem espaço à direita):
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\>' | cat -A
abcd abcd$
Ou, com sed:
Limites de quatro palavras:
$ echo "abc %-= def." | sed 's/\b/ |>X<| /g'
|>X<| abc |>X<| %-= |>X<| def |>X<| .
Dois inícios de palavra:
$ echo "abc %-= def." | sed 's/\</ |>X<| /g'
|>X<| abc %-= |>X<| def.
E dois finais de palavra:
$ echo "abc %-= def." | sed 's/\>/ |>X<| /g'
abc |>X<| %-= def |>X<| .
Referência
Da informação GNU sed:
'\b'
Corresponde a um limite de palavra; isto é, corresponde se o caractere à esquerda for um caractere de "palavra" e o caractere à direita for um caractere "não-palavra" ou vice-versa.
$ echo "abc %-= def." | sed 's/\b/X/g' XabcX %-= XdefX.
Começo
'<' Corresponde ao início de uma palavra.
$ echo "abc %-= def." | sed 's/\</X/g' Xabc %-= Xdef.
Fim
'>' Corresponde ao final de uma palavra.
$ echo "abc %-= def." | sed 's/\>/X/g' abcX %-= defX.