使用egrep的2个正则表达式之间的差异

时间:2013-08-28 18:15:08

标签: regex linux grep

我想知道它们之间有什么区别:

sudo egrep "(08/21/13\-)*(61284103)" /path/to/some_file
sudo egrep "(08/21/13)\-*(61284103)" /path/to/some_file

让我们说,有关详细信息,文件“some_file”有下一个信息:

08/21/13-01:15:09 foo bar bar and other foo = 11 (61284103)
08/21/13-01:15:11 foo bar number 61284103 another foo

第一行返回两行,但第二行不起作用。

3 个答案:

答案 0 :(得分:3)

sudo egrep "(08/21/13\-)*(61284103)" /path/to/some_file
sudo egrep "(08/21/13)\-*(61284103)" /path/to/some_file

第一个正则表达式查找日期加上连字符的0个或多个匹配项,而第二个正则表达式查找日期后跟0或更多连字符后跟该数字。我猜想正则表达式都不是你想要使用的。

您可能希望在正则表达式的中间使用.*,它允许日期和数字之间的任何文本。不需要括号或\转义-

sudo egrep "08/21/13-.*61284103" /path/to/some_file

答案 1 :(得分:3)

你的第一个表达“意外起作用”。实际上唯一匹配的是61284103部分 - 第一部分是在第二部分之前找到“08/21/13-的零个或多个实例”,并且它在那里(零次) 。 在第二部分中,您将查找第一个表达式,后跟零个或多个-实例,然后是第二个表达式。那不行 - 中间还有“其他东西”。

如果您确实想要与第一个和第二个表达式匹配的行,则需要使用:

08/21/13.*61284103

这匹配“完全匹配字符串08/21/13后跟”任何字符的零个或多个实例“(.*),后跟”完全字符串61284103。这就是你追求的目标。

答案 2 :(得分:2)

在第一个中,重复所有08/21/13-零次或多次。所以它正在寻找这样的东西:

61284103
08/21/13-61284103
08/21/13-08/21/13-61284103
...

它可以匹配两个行0次(第一个变体)。

第二个匹配08/21/13,然后重复0个或更多个连字符。所以它正在寻找这样的东西:

08/21/1361284103
08/21/13-61284103
08/21/13--61284103
...

但是,所有字符串都没有08/21/13仅用61284103中的连字符分隔,因此两行都不匹配。

如果您想使用*作为通配符,请使用.*代替(重复任意字符0次或更多次)。