如何正确使用正则表达式查找?

如何正确使用正则表达式查找?

我无法弄清楚 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工作正常。

相关内容