根据 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
答案1
\<
和\>
分别匹配单词开头和结尾的空字符串,并且单词组成字符只有:
[[:alnum:]_]
从man grep
:
Word-constituent characters are letters, digits, and the underscore.
因此,您的正则表达式失败,因为/
它不是一个有效的单词组成字符。
相反,当周围有空格时,您可以使用-w
选项来grep
匹配单词:
grep -wo '/media/fresh' /etc/fstab
例子:
$ grep -wo '/media/fresh' <<< '/dev/sdb1 /media/fresh ext2 defaults 0 0'
/media/fresh
答案2
\<
(以及)的这个问题\b
不仅适用于/
,而且适用于所有非单词字符。 (即除了[[:alnum:]]
和以外的字符_
。)
问题是正则表达式引擎总是会绕过非单词字符,就像/
搜索下一个锚点时一样\<
。这就是为什么您不应该/
在 后面放置非单词字符\<
。如果你这样做,通过构造,没有任何东西会匹配。
grep 选项的替代方案-w
如下:
egrep "(^|\W)/media/fresh($|\W)"