2012-06-12 146 views
1

我在文件夹中获取类似.log和_log的文件,我可以使用/*.log$/选择.log文件,但无法找到_log文件。匹配日志文件的模式

需要一个正则表达式模式,它将从指定的文件夹中获取这两种类型的文件。

回答

3

你的问题被标记'perl'和'linux'。我假设你在谈论Perl风格的正则表达式,因为它看起来就是你在示例代码片段中显示的内容。

*.序列是一个错误。

让我们专注于你想要匹配什么。你想匹配任何以点结尾的文件名,后面跟着文字字符'log'。您还希望匹配以下划线结尾的任何文件名,后跟文字字符“日志”。你真的不应该关注可以在最终点或下划线之前出现的“任何事情”。所以正则表达式可能会写得更好:

/[._]log$/ 

请注意,我们甚至不打扰点星。在这种情况下这没有帮助。

如果您希望您的模式也可以匹配文字字符'log'可以随意选择的整数序列(在您的问题中没有提及,但在您的后续评论之一中讨论过),那么可以编写它像这样:

/[._]log\d*$/ 

这里的 '明星' 有帮助的;它允许零或多个数字夹在'g'和字符串的末尾之间。

+0

谢谢DavidO 但是我可能会得到诸如_log1,_log2和.log1,.log2相同的文件等等 –

+0

然后看到我的更新(你应该更新你的原始问题,提到这一点)。 – DavidO

+1

好的答案,这应该被接受。 – aglassman

-1

使用正则表达式/.*[._]log$/

我很惊讶,你的第一个案件工作 - /*.log$/是不合法的正则表达式(因为*不说什么它应该匹配零或更多的的)。仔细检查你当前的结果。

+0

谢谢sarnold 我的第一个结果工作但生病双重检查它。 –

+0

sarnold和另外一件事将这个正则表达式/.*[._]log$/挑选出像_log1或.log1这样的文件,并且类似地 –

1

我完全同意(由upvoting)与戴维的解决方案,但它通常会更有意义,并增加可读性,使用水珠()从一个特定的目录中获取文件的列表

my $dir = "/path/here"; 

my @log_files = grep { /[\._]log\d*$/ } glob("$dir/*"); 

print join "\n", @log_files; 

这将赶上

foo.log 
foo_log 
foo.log1 
foo_log22 
+1

似乎超出了这个问题的范围。 – aglassman