我在文件夾中獲取類似.log和_log的文件,我可以使用/*.log$/選擇.log文件,但無法找到_log文件。匹配日誌文件的模式
需要一個正則表達式模式,它將從指定的文件夾中獲取這兩種類型的文件。
我在文件夾中獲取類似.log和_log的文件,我可以使用/*.log$/選擇.log文件,但無法找到_log文件。匹配日誌文件的模式
需要一個正則表達式模式,它將從指定的文件夾中獲取這兩種類型的文件。
你的問題被標記'perl'和'linux'。我假設你在談論Perl風格的正則表達式,因爲它看起來就是你在示例代碼片段中顯示的內容。
*.
序列是一個錯誤。
讓我們專注於你想要匹配什麼。你想匹配任何以點結尾的文件名,後面跟着文字字符'log'。您還希望匹配以下劃線結尾的任何文件名,後跟文字字符「日誌」。你真的不應該關注可以在最終點或下劃線之前出現的「任何事情」。所以正則表達式可能會寫得更好:
/[._]log$/
請注意,我們甚至不打擾點星。在這種情況下這沒有幫助。
如果您希望您的模式也可以匹配文字字符'log'可以隨意選擇的整數序列(在您的問題中沒有提及,但在您的後續評論之一中討論過),那麼可以編寫它像這樣:
/[._]log\d*$/
這裏的 '明星' 爲有幫助的;它允許零或多個數字夾在'g'和字符串的末尾之間。
使用正則表達式/.*[._]log$/
。
我很驚訝,你的第一個案件工作 - /*.log$/
是不合法的正則表達式(因爲*
不說什麼它應該匹配零或更多的的)。仔細檢查你當前的結果。
謝謝sarnold 我的第一個結果工作但生病雙重檢查它。 –
sarnold和另外一件事將這個正則表達式/.*[._]log$/挑選出像_log1或.log1這樣的文件,並且類似地 –
我完全同意(由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
似乎超出了這個問題的範圍。 – aglassman
謝謝DavidO 但是我可能會得到諸如_log1,_log2和.log1,.log2相同的文件等等 –
然後看到我的更新(你應該更新你的原始問題,提到這一點)。 – DavidO
好的答案,這應該被接受。 – aglassman