Limites des mots grep

22

Accorging à la documentation GNU:

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

Mon / etc / fstab ressemble à ceci:

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

Je veux que grep renvoie TRUE / FALSE pour l'existence de / media / fresh. J'ai essayé d'utiliser \<et \>mais cela n'a pas fonctionné. Pourquoi?

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

Solution de contournement:

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

Mais ça a l'air plus laid.

Mon grep est 2.5.1

Felipe Alvarez
la source
4
Je suppose que /n'est pas considéré comme un caractère de mot, donc l'expression régulière ne correspondra pas - "\ b correspond avant et après une séquence alphanumérique" est plus exact que de dire "avant et après un mot"
Felipe Alvarez

Réponses:

27

\<et faire \>correspondre respectivement une chaîne vide au début et à la fin d'un mot et seuls les caractères constitutifs du mot sont:

[[:alnum:]_]

De man grep:

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

Donc, votre Regex échoue car ce /n'est pas un caractère constitutif de mot valide.

Au lieu de cela, comme vous avez des espaces, vous pouvez utiliser l' -woption de greppour faire correspondre un mot:

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

Exemple:

$ grep -wo '/media/fresh' <<< '/dev/sdb1       /media/fresh      ext2   defaults     0 0'
/media/fresh
heemayl
la source
Je le pense autant après avoir posté ma question. Une suggestion pour ce que je veux réaliser?
Felipe Alvarez
@FelipeAlvarez Vérifiez mes modifications ..
heemayl
1

Ce problème avec \<(et aussi \b) s'applique non seulement à /, mais à tous les caractères non verbaux. (c'est-à-dire des caractères autres que [[:alnum:]]et _.)

Le problème est que le moteur d'expression régulière contournera toujours un caractère non-mot comme /lors de la recherche de l'ancre suivante \<. C'est pourquoi vous ne devez pas mettre de caractères non verbaux comme /juste après \<. Si vous le faites, par construction, rien ne correspondra.

Une alternative à l' -woption grep serait quelque chose comme ceci:

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