如何正確使用正規表示式查找?

如何正確使用正規表示式查找?

我無法弄清楚 find with -regexoption 的正確用法:

例如,給出以下範例:

Morcheeba/Big Calm/02 Shoulder Holster.flac
Morcheeba/Big Calm/02. Shoulder Holster.flac

我只想匹配表單中的字串path/to/file/## filename.ext,不帶點。

我嘗試過:

find Morcheeba/ -regextype egrep -iregex ".*[0-9]{2}*[a-z]*flac$"

和一些變化,但我總是得到所有文件或沒有。

怎麼了?

提前致謝。

答案1

請注意,-regex/ -iregex(GNU 副檔名)就像完整路徑上的標準-path匹配,而不僅僅是文件名。

如果你想查找其文件姓名(相對於小路) 以 2 位十進制數字開頭,後面跟著不是十進制數字的內容並以 結尾.flac,您可以便攜式地執行以下操作:

find . -name '[0-9][0-9][!0-9]*.[fF][lL][aA][cC]'

請注意,它不會匹配 on01.flac因為[!0-9]在那裡無法匹配。相反,你可以這樣寫:

find . -name '[0-9][0-9][!0-9]*' -name '*.[fF][lL][aA][cC]'

它們使用通配符模式,而不是正規表示式。

要使用 GNUfind-iregex,等價物是:

find . -regextype egrep -iregex '.*/[0-9]{2}[^0-9/][^/]*\.flac'
find . -regextype egrep -iregex '.*/[0-9]{2}([^0-9/][^/]*)?\.flac'

也就是說,我們將兩個數字錨定在開頭,因為我們確保正規表示式的其餘部分不會跨越/.

答案2

正如 @steeldriver 所建議的,正規表示式.*[0-9]{2}[^.]*\.flac運作正常。

相關內容