多个替代字符串的Perl正则表达式语法

时间:2014-05-10 09:20:24

标签: perl syntax

use File::Find;
find(sub { -f && /\.tmp$/ && unlink }, '.')

用于删除* .tmp文件的Perl脚本。我的问题是让它搜索多个扩展名,例如* .tmp OR * .tmp2。我尝试过一些变种,比如

find (sub { -f && /\.tmp$,.tmp2$/ && unlink }, '.')

但我似乎无法解决我确定的简单语法问题。

3 个答案:

答案 0 :(得分:2)

这并非真正针对File::Find。您只是使用普通的正则表达式匹配,因此您需要一个匹配多个扩展名的正则表达式,例如。

/\.tmp2?$/

?表示其前面的表达式(本例中为2)是可选的。在更一般的情况下,您可以写:

/\.(ext1|ext2|ext3)$/

匹配3个不同的扩展程序。

答案 1 :(得分:1)

正则表达式(此处:/\.tmp$//\.tmp$,.tmp2$/)是他们自己的语言 - 请阅读Perl Regular Expressions Tutorial以获取介绍。要指定替代模式,我们不使用逗号(它在Perl正则表达式中没有特殊含义),而是管道:|

/\.tmp$|\.tmp2$/

表示“字符串末尾的文字字符串.tmp或字符串末尾的文字字符串.tmp2”。我们可以将其简化为

/[.]tmp[2]?$/

表示“字符串.tmp,可选地后跟2,位于字符串的末尾”。

答案 2 :(得分:0)

您可以尝试使用正则表达式。在此示例中,我添加了\d*以匹配tmp字符串后的可选数字。

作为一个单行:

perl -MFile::Find -e 'find(sub { -f && m/\.tmp\d*$/ && unlink }, q|.|)'