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


44

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

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)"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.