我想知道它们之间有什么区别:
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
第一行返回两行,但第二行不起作用。
答案 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次或更多次)。