1

我在文件夹中获取 .log 和 _log 之类的文件,我可以使用 /*.log$/ 选择 .log 文件,但无法找到 _log 文件。

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

4

3 回答 3

3

您的问题被标记为“perl”和“linux”。我在这里假设您正在谈论 Perl 样式的正则表达式,因为看起来这就是您在示例代码段中显示的内容。

*.顺序是错误的。

让我们专注于您想要匹配的内容。您想匹配以点结尾并后跟文字字符“log”的任何文件名。您还希望匹配以下划线结尾的任何文件名,后跟文字字符“log”。你真的不应该关心最后一个点或下划线之前的“任何东西”。所以正则表达式可能会更好地写成这样:

/[._]log$/

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

如果您希望您的模式也匹配其中文字字符“log”可以选择后跟整数序列的文件(您的问题中未提及,但在您的后续评论之一中进行了讨论),您可以这样写:

/[._]log\d*$/

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

于 2012-06-12T10:03:50.923 回答
1

我完全同意(通过投票)DavidO 的解决方案,但使用 glob() 从特定目录获取文件列表通常更有意义,并提高可读性

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
于 2012-06-12T10:32:50.067 回答
-1

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

我很惊讶你的第一个案例有效——/*.log$/不是合法的正则表达式(因为*没有说明应该匹配零个或多个)。仔细检查您当前的结果。

于 2012-06-12T09:51:56.953 回答