1

我想知道有什么区别:

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

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

4

3 回答 3

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
于 2013-08-28T18:20:55.780 回答
3

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

如果你真的想要匹配第一个和第二个表达式的行,你需要使用:

08/21/13.*61284103

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

于 2013-08-28T18:21:17.523 回答
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 次或更多次)。

于 2013-08-28T18:17:44.590 回答