请向我解释为什么以下表达式不会输出任何内容:
echo "<firstname.lastname@domain.com>" | egrep "<lastname@domain.com>"
但以下是:
echo "<firstname.lastname@domain.com>" | egrep "\<lastname@domain.com>"
第一个的行为是预期的,但第二个不应该输出。是&#34; \&lt;&#34;在正则表达式中被忽略或引起一些其他特殊行为?
答案 0 :(得分:5)
AS @hwnd说\<
匹配单词的开头。 ie
字词边界\b
必须存在于起始字符之前(输入中\<
之后的字符必须是字符),
在您的示例中,
echo "<firstname.lastname@domain.com>" | egrep "<lastname@domain.com>"
在上面的示例中,egrep检查在lastname字符串之前存在的文字<
字符。但是没有,所以它什么都不打印。
$ echo "<firstname.lastname@domain.com>" | egrep "\<lastname@domain.com>"
<firstname.**lastname@domain.com>**
但在此示例中,\b
字符串之前存在单词边界lastname
,因此它会打印匹配的字符。
更多示例:
$ echo "namelastname@domain.com" | egrep "\<e@domain.com"
$ echo "namelastname@domain.com" | egrep "\<lastname@domain.com"
$ echo "namelastname@domain.com" | egrep "\<com"
namelastname@domain.**com**
$ echo "<firstname.lastname@domain.com>" | egrep "\<@domain.com>"
$ echo "n-ame-lastname@domain.com" | egrep "\<ame-lastname@domain.com"
n-**ame-lastname@domain.com**