簡體   English   中英

來自“ls”輸出的文件名的 Perl 通配符匹配

[英]Perl wildcard match of filenames from "ls" output

#!/usr/bin/perl

my @allFiles=`ls *.gz`;

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

我正在嘗試使用上面的代碼打印所有前綴為 0000 的文件名。例如 00001.gz、00002.gz 等

在正則表達式中與 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塊中的代碼為每個運行,如果計算結果為真,則該元素通過。 它是相同的正則表達式,默認情況下應用於作為隱式迭代器的$_ 變量(並別名為當前處理的元素)。 所以grep返回所需的列表。


對於您的具體示例,即使只是這樣也可以

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

print "$_\n" for @files;

這將獲取0000之后帶有一位數字的所有文件,然后是.gz

請參閱鏈接的File::Glob文檔中接受的元字符列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM