Referencia

Referencia

En la página de manual de grep, veo

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.

Pero todavía no puedo entender la diferencia. Para mí, \bes la notación de Perl para el límite de palabras, mientras que \<es la notación de Vim para el mismo propósito.
PD: El inglés no es mi lengua materna. Perdóneme si la diferencia le resulta obvia.

Respuesta1

\<coincide con el principio de una palabra
\>coincide con el final de una palabra
\bcoincide con ambos límites si está al final o al principio

Lo importante de esos caracteres especiales es que coinciden con una cadena vacía y no con el límite de la palabra en sí. el límite de una palabra es lo contrario del conjunto de caracteres representado por el \wequivalente de [_[:alnum:]](letra a a Z, dígitos y _) en notación Posix.

Ejemplo

Finalmente,Graeme encuentra un ejemplo muy interesante.:

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

Actualmente, este ejemplo muestra que a veces puede ser útil hacer coincidir precisamente el final de la palabra en lugar de un límite de palabra porque se evita el uso de caracteres de espacio coincidentes al hacer coincidir el final de la palabra.
Entonces, en un ejemplo más útil, diría que si desea hacer coincidir un carácter que no es una palabra y el final de esta no palabra, no puede usar \>; pero tal vez \bpueda usarse en este caso particular porque coincidirá con el comienzo de la siguiente palabra.

Hasta ahora ningún ejemplo logra llegar a mi mente. Pero en mi opinión, probablemente hay algunos casos de uso en los que tiene sentido, pero supongo que es solo para fines de legibilidad, porque cuando \blo pones es vago, pero si especificas el comienzo o el final de la palabra, entonces se entiende mejor la expresión regular a las personas que la leen.

Respuesta2

¿Para responder a la pregunta sobre tu título?

¿Cuál es la diferencia entre \by \<...?

Casi ninguno. Ambos coinciden con elPerímetro, la transición entre una palabra y una no palabra.

El únicotécnicola diferencia es:

  • El \bpartido el límite enambosinicio y final de una palabra.
  • El \<único que coincide con elcomenzarde una palabra.
  • El \>único que coincide con elfinde una palabra.

Elprácticola diferencia es:

$ 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.

Se podría hacer lo mismo con los espacios (se agregó un gato para revelar los espacios):

Hasta el "límite de palabra" más a la derecha (cualquiera) (tenga en cuenta los espacios):

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

Hasta el "inicio de palabra" más a la derecha (mismo punto):

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

Hasta el "final de palabra" más a la derecha (sin espacios al final):

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

O, con sed:

Límites de cuatro palabras:

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

Dos inicios de palabra:

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

Y dos finales de palabra:

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

Referencia

De información de GNU sed:

'\b'
Coincide con el límite de una palabra; es decir, coincide si el carácter de la izquierda es un carácter de "palabra" y el carácter de la derecha es un carácter "sin palabra", o viceversa.

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

Comienzo

'<' Coincide con el comienzo de una palabra.

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

Fin

'>' Coincide con el final de una palabra.

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

información relacionada