![Referencia](https://rvso.com/image/52094/Referencia.png)
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í, \b
es 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
\b
coincide 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 \w
equivalente 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 \b
pueda 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 \b
lo 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
\b
y\<
...?
Casi ninguno. Ambos coinciden con elPerímetro, la transición entre una palabra y una no palabra.
El únicotécnicola diferencia es:
- El
\b
partido 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.