Grep字边界


22

根据GNU文档:

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

我的/ etc / fstab看起来像这样:

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

我希望grep为/ media / fresh的存在返回TRUE / FALSE。我尝试使用\<\>但是没有用。为什么?

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

解决方法:

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

但是看起来很丑。

我的grep是2.5.1


Answers:


27

\<\>分别在单词的开头和结尾匹配空字符串,并且只有单词构成字符为:

[[:alnum:]_]

来自man grep

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

因此,您的Regex失败了,因为/它不是有效的单词组成字符。

当周围有空格时,可以使用-w选项of grep来匹配单词:

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

例:

$ grep -wo '/media/fresh' <<< '/dev/sdb1       /media/fresh      ext2   defaults     0 0'
/media/fresh

发布问题后,我的想法就一样多。对我想要达到的目标有什么建议吗?
费利佩·阿尔瓦雷斯

@FelipeAlvarez检查我的编辑
。– heemayl

1

\<(和\b)的问题不仅适用于/,而且适用于所有非单词字符。(即[[:alnum:]]和以外的字符_)。

问题在于,正则表达式引擎将始终像/搜索下一个锚点时一样绕过非单词字符\<。这就是为什么您不应该/在之后放置非单词字符的原因\<。如果您这样做,那么通过构建,什么都不会匹​​配。

-wgrep选项的替代方案如下所示:

egrep "(^|\W)/media/fresh($|\W)"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.