我在文件夹中获取类似.log和_log的文件,我可以使用/*.log$/选择.log文件,但无法找到_log文件。匹配日志文件的模式
需要一个正则表达式模式,它将从指定的文件夹中获取这两种类型的文件。
我在文件夹中获取类似.log和_log的文件,我可以使用/*.log$/选择.log文件,但无法找到_log文件。匹配日志文件的模式
需要一个正则表达式模式,它将从指定的文件夹中获取这两种类型的文件。
你的问题被标记'perl'和'linux'。我假设你在谈论Perl风格的正则表达式,因为它看起来就是你在示例代码片段中显示的内容。
*.
序列是一个错误。
让我们专注于你想要匹配什么。你想匹配任何以点结尾的文件名,后面跟着文字字符'log'。您还希望匹配以下划线结尾的任何文件名,后跟文字字符“日志”。你真的不应该关注可以在最终点或下划线之前出现的“任何事情”。所以正则表达式可能会写得更好:
/[._]log$/
请注意,我们甚至不打扰点星。在这种情况下这没有帮助。
如果您希望您的模式也可以匹配文字字符'log'可以随意选择的整数序列(在您的问题中没有提及,但在您的后续评论之一中讨论过),那么可以编写它像这样:
/[._]log\d*$/
这里的 '明星' 为有帮助的;它允许零或多个数字夹在'g'和字符串的末尾之间。
使用正则表达式/.*[._]log$/
。
我很惊讶,你的第一个案件工作 - /*.log$/
是不合法的正则表达式(因为*
不说什么它应该匹配零或更多的的)。仔细检查你当前的结果。
谢谢sarnold 我的第一个结果工作但生病双重检查它。 –
sarnold和另外一件事将这个正则表达式/.*[._]log$/挑选出像_log1或.log1这样的文件,并且类似地 –
我完全同意(由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
似乎超出了这个问题的范围。 – aglassman
谢谢DavidO 但是我可能会得到诸如_log1,_log2和.log1,.log2相同的文件等等 –
然后看到我的更新(你应该更新你的原始问题,提到这一点)。 – DavidO
好的答案,这应该被接受。 – aglassman