Límites de palabras grep

22

Según la documentación de GNU:

‘\<’ Match the empty string at the beginning of word.
‘\>’ Match the empty string at the end of word.

Mi / etc / fstab se ve así:

/dev/sdb1       /media/fresh      ext2   defaults     0 0

Quiero que grep devuelva VERDADERO / FALSO por la existencia de / media / fresh. Traté de usar \<y \>no funcionó. ¿Por qué?

egrep '\</media/fresh\>' /etc/fstab

Solución alternativa:

egrep '[[:blank:]]/media/fresh[[:blank:]]' /etc/fstab

Pero se ve más feo.

Mi grep es 2.5.1

Felipe Alvarez
fuente
44
Supongo /que no se considera un carácter de palabra, por lo que regex no coincidirá - "\ b coincide antes y después de una secuencia alfanumérica" ​​es más exacto que decir "antes y después de una palabra"
Felipe Alvarez

Respuestas:

27

\<y \>coinciden con una cadena vacía al principio y al final de una palabra, respectivamente, y solo los caracteres constitutivos de la palabra son:

[[:alnum:]_]

De man grep:

Word-constituent characters are letters, digits, and the underscore.

Entonces, su Regex está fallando porque /no es un carácter constituyente de palabra válido.

En cambio, como tiene espacios alrededor, puede usar la -wopción de grephacer coincidir una palabra:

grep -wo '/media/fresh' /etc/fstab

Ejemplo:

$ grep -wo '/media/fresh' <<< '/dev/sdb1       /media/fresh      ext2   defaults     0 0'
/media/fresh
heemayl
fuente
Me imagino lo mismo después de publicar mi pregunta. ¿Alguna sugerencia para lo que quiero lograr?
Felipe Alvarez
@FelipeAlvarez Revise mis ediciones ..
heemayl
1

Este problema con \<(y también \b) se aplica no solo a /, sino a todos los caracteres que no son palabras. (es decir, caracteres distintos de [[:alnum:]]y _.)

El problema es que el motor de expresiones regulares siempre omitirá un carácter que no sea de palabra, como /cuando busca el siguiente ancla \<. Es por eso que no debes poner caracteres que no sean palabras como /justo después \<. Si lo hace, por construcción, nada coincidirá.

Una alternativa a la -wopción de grep, sería algo como esto:

egrep "(^|\W)/media/fresh($|\W)"
SE
fuente