【发布时间】:2015-02-18 18:29:43
【问题描述】:
我需要一种方法来匹配目录中的文件名。
例如我有三个文件:
CAt_DoG_ZebRa.TXT
MOUSE_lion_deer_BIRD.TXT
fIsh_biRD_LION.TXT
无论如何我都不是正则表达式专家,但是我之前在 SnapLogic 和 Pentaho 中使用过类似的东西:
(?i).*(?=.*bird)(?=.*lion).*.TXT
上面将匹配所有包含单词“bird”和“lion”的文件名,忽略大小写,单词的顺序无关紧要。很强大!所以它会匹配这两个:
MOUSE_lion_deer_BIRD.TXT
fIsh_biRD_LION.TXT
我结合 find 和 grep 尝试了上述的许多变体,但无济于事。例如:
find . -regex ".*/(?i).*(?=.*bird)(?=.*lion).*.TXT"
上面的查找不匹配任何内容。
谁能推荐一种方法来做到这一点?
【问题讨论】:
-
所以你想匹配包含狮子或鸟的文件?即
Cat_dog_zebra不会被包括在内? -
包含狮子和鸟的。是的 Cat_dog_zebra 不会被包括在内。
-
Find 的
-regex在我知道的find的任何实现中默认不是PCRE(您在此处编写代码的语法)。在 GNU 系统上,如果你看到手册页,你会看到一个-regextype让你选择你想要的语法。 -
也就是说,我完全不知道您为什么需要正则表达式。如果常规 glob 无法做到这一点,那么 extglobs 可以——以及 bash 4 或 zsh,你有一个足够强大的 globing 语法,即使在递归情况下也根本不需要
find。