Perl通配符匹配“ ls”输出中的文件名

耶尔克斯
#!/usr/bin/perl

my @allFiles=`ls *.gz`;

for my $file (@allFiles) {
    if ($file =~ '0000*.gz') {
         print $file;
    }
}

我正在尝试上面的代码来打印所有前缀为0000的文件名。例如00001.gz,00002.gz等

与regex中shell的通配符*非常接近.** 量词的手段,它所收到的模式匹配“零个或多个”时间和.方式“的任何字符,”看在perlre正则表达式但是似乎您希望在零后添加一些内容,然后改用它.+来匹配任何字符一次或多次。为了匹配一个字面量的转义符,\.

接下来,没有理由使用外部命令来执行操作。在Perl中

my @allFiles = glob "*.gz";

文档链接在末尾。

最后,始终启用警告并严格执行。

use warnings;
use strict;

my @allFiles = glob "*.gz";

foreach my $file (@allFiles) {
    if ($file =~ /^0000.+\.gz/) {
        print "$file\n";
    }
}

正则表达式模式匹配:0000在字符串(^的开头,后跟.匹配一个或多个时间(+的任何字符),然后是文字句点(\.)和文字gz请注意,这.+意味着一次或多次. 匹配,它不必是相同的字符。

调整为最适合您的实际需求和目录的内容。例如,如果您只希望文件中的数字后跟零,则需要/^0000\d+\.gz/要同时捕获文件00001a.gz,您需要在数字串之后允许非数字,例如,/^0000\d+.*\.gz/

有关正则表达式教程和glob请参见perlretut;对于名称中带有空格的内容,请参见File :: Glob


还有其他方法可以做到这一点。例如,您需要过滤文件名列表,因此

my @files = grep { /^0000.+\.gz/ } glob "*.gz";

glob是在列表环境中所规定的grep所以它返回它匹配所有文件的列表。(在标量上下文中对其进行迭代。)grep的块中的代码针对每个代码运行,并且如果评估为true,则该元素通过。它是相同的正则表达式,默认情况下应用于作为隐式迭代器的$ _变量(并别名为当前处理的元素)。因此,grep返回所需的列表。


对于您的特定示例,即使这样做也可以

my @files = glob "0000[0-9].gz";

print "$_\n" for @files;

这将获取所有文件0000,其后跟一个数字.gz

请参阅链接文档中可接受的元字符列表File::Glob

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

匹配正则表达式的文件名,但在带通配符的文件夹中

RGI 输出文件名与蛇文件输出文件名不匹配

如何使用字典中的“键”作为匹配文件名中的通配符模式?

SSIS 文件名中的通配符

将n字母文件名与ls匹配

Perl正则表达式匹配部分作为输出文件名

Java中的通配符匹配

Python中的通配符匹配

python中的通配符匹配

PowerShell-只读我在目录中指定的通配符文件名,并将结果输出到txt文件中

zsh中 - 复杂的文件名匹配

模式与R中的文件名匹配

Perl,使用带有部分这些文件名的数组来匹配目录中的文件

处理文件名中带有通配符的文件

如何从ls输出中检索文件名

使用通配符检查文件名搜索模式中的冲突

在 tcl 中复制文件名(带通配符)

使用通配符在blob中搜索文件名

使用零填充文件名中的索引并接受通配符

Make中的通配符模式匹配

Python中的通配符列表匹配

在Perl中以特殊字符打开文件名中的文件

为什么此(扩展)通配符与我要排除的文件名匹配?

如何获取与“ *” glob通配符匹配的文件名的子字符串?

在Win7捕获的递归通配符搜索匹配列表上,包括文件名和路径

Perl打开文件名中的变量的文件

批处理文件以对与文件名和输出文件组中前6个字符匹配的文件进行计数

如何使用通配符为分组规则定义Slurm输出文件名

Snakemake,使用通配符时如何更改输出文件名