2012-06-12 125 views
1

我在文件夾中獲取類似.log和_log的文件,我可以使用/*.log$/選擇.log文件,但無法找到_log文件。匹配日誌文件的模式

需要一個正則表達式模式,它將從指定的文件夾中獲取這兩種類型的文件。

回答

3

你的問題被標記'perl'和'linux'。我假設你在談論Perl風格的正則表達式,因爲它看起來就是你在示例代碼片段中顯示的內容。

*.序列是一個錯誤。

讓我們專注於你想要匹配什麼。你想匹配任何以點結尾的文件名,後面跟着文字字符'log'。您還希望匹配以下劃線結尾的任何文件名,後跟文字字符「日誌」。你真的不應該關注可以在最終點或下劃線之前出現的「任何事情」。所以正則表達式可能會寫得更好:

/[._]log$/ 

請注意,我們甚至不打擾點星。在這種情況下這沒有幫助。

如果您希望您的模式也可以匹配文字字符'log'可以隨意選擇的整數序列(在您的問題中沒有提及,但在您的後續評論之一中討論過),那麼可以編寫它像這樣:

/[._]log\d*$/ 

這裏的 '明星' 有幫助的;它允許零或多個數字夾在'g'和字符串的末尾之間。

+0

謝謝DavidO 但是我可能會得到諸如_log1,_log2和.log1,.log2相同的文件等等 –

+0

然後看到我的更新(你應該更新你的原始問題,提到這一點)。 – DavidO

+1

好的答案,這應該被接受。 – aglassman

-1

使用正則表達式/.*[._]log$/

我很驚訝,你的第一個案件工作 - /*.log$/是不合法的正則表達式(因爲*不說什麼它應該匹配零或更多的的)。仔細檢查你當前的結果。

+0

謝謝sarnold 我的第一個結果工作但生病雙重檢查它。 –

+0

sarnold和另外一件事將這個正則表達式/.*[._]log$/挑選出像_log1或.log1這樣的文件,並且類似地 –

1

我完全同意(由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 
+1

似乎超出了這個問題的範圍。 – aglassman