为什么当我在每个后半部分将grep更改为egrep时,得到了不同的答案?
当我将grep
改为egrep
后,我得到了不同的答案。为什么会这样呢?原因是在egrep
中,|
是元字符,而在普通的grep
中,它是一个普通字符。
在egrep
中的|F$
表示匹配空字符串或以F
结尾的字符串,因此它在每一行都找到了空字符串。
而在grep
中,相同的表达式表示在行尾匹配|F
。如果要在egrep
中查找该表达式,需要使用反斜杠对元字符进行转义:grep -E '\|F$' enrolments
。
简而言之,普通的grep
命令理解基本正则表达式(BRE),而egrep
或扩展的grep
命令理解扩展正则表达式(ERE)。某些版本的grep
(如GNU的grep
)可以编译为识别Perl兼容的正则表达式(PCRE)。
为什么我们更喜欢使用grep -E
而不是egrep
呢?是因为egrep
可能会在未来被弃用吗?我可以看到使用统一二进制文件有一些优点,就像人们使用busybox的原因一样;但还有其他原因吗?比如代码规范化?
是的,egrep
在POSIX中已经不再被记录。在同一页面的解释中说:这个grep
已经以向上兼容的方式进行了增强,以提供与历史egrep
和fgrep
命令完全一样的功能。标准开发者明确意图将这三个grep命令合并为一个单一的命令。旧的egrep
和fgrep
命令可能会作为实现扩展继续支持很多年,以允许历史应用程序运行不受修改。