为什么我得到不同的答案,当我改变的grep在每个
$ egrep "^COMP[29]041" enrolments | grep "|F$" | wc -l
24
$ egrep "^COMP[29]041" enrolments | egrep "|F$" | wc -l
166
$
文件enrolments
的内容下半年egrep命令:为什么我得到不同的答案,当我改变的grep在每个
COMP2041|4836917|Ruld, Ruld |3978/2|M
COMP2041|4850109|Rvyiparzal, Ilbvuy |3979/3|M
COMP2041|2858836|Rzild, Fia Held |3730/4|M
COMP2041|4823158|Sheld, Yild |3978/2|M
COMP2041|4818044|Sheo, Sheo |3978/2|M
COMP2041|4818497|Sheo, Xa |3978/2|M
COMP9041|4899688|Shild, Ge |8680/2|M
COMP2041|4869506|Shild, Yild |3645/2|M
COMP9041|4897426|Shild, Yild |8680/2|M
COMP9041|4368551|Sho, Wuld |8684 |M
COMP2041|4339940|Shuld, Puaxail Baili |3978/3|F
COMP2041|4330093|Veh, Yeold-He |3711/3|M
COMP2041|2230267|Vikil, Ivrha |3978/3|F
COMP2041|4312663|Viy Chiobhova, Jiozrigh |3978/1|M
.......
的问题是,为什么我得到不同的答案时,我改变了grep
到egrep
在每个后半部分。 grep
和egrep
有什么区别?
在egrep
(或,优选地,grep -E
),则|
是元字符,而在纯grep
它是一个普通的(非甲基)字符。
|F$
term egrep
在行末查找空字符串或F
;它会在每一行找到一个空字符串。
grep
中的相同术语在行尾寻找|F
。要用egrep
来寻找,你需要用反斜杠来代替元字符:grep -E '\|F$' enrolments
。
总之,普通的grep
命令理解Basic Regular Expressions(BRE)。 egrep
或'extended grep
'命令理解Extended Regular Expressions(ERE)。 grep
的某些版本(例如GNU grep
)可以编译为识别Perl-Compatible Regular Expressions(PCRE)。
为什么'grep -E'优先于'egrep'?是否因为'egrep'可以在将来被弃用?我可以看到使用统一二进制文件有一些优点,这与为什么人们使用busybox相同;但是还有其他原因吗?像代码标准化一样? – anishsane
@anishsane:是的; “egrep”不再记录在POSIX中。理由(在我引用的同一页上)说:_这个'grep'已经以向上兼容的方式得到了增强,以提供历史'egrep'和'fgrep'命令的确切功能。标准开发人员的明确意图是将三个问题整合为一个命令。 旧的'egrep'和'fgrep'命令很可能会作为实现扩展支持多年,从而允许历史应用程序未经修改地运行。 –
这个问题的'有什么不同'部分相当于Unix SE问题;示例材料完全不在场外副本中。 –