用正则表达式查找

时间:2016-12-23 17:30:35

标签: regex bash find

我从bash脚本开始,但这是我的问题

我一直在努力寻找。

当我find . ! -regex ".*(jpeg|jpg|gif|pdf)+$"时 虽然实际上没有此扩展名的文件,但查找找不到任何内容。好像它不能识别正则表达式组

我找到了find . ! \( -name '*.jpeg' -o -name '*.jpg' -o -name '*.gif' \)

我的问题是:有没有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:2)

正确的regEx应该是

find . ! -regex '.*\.\(jpeg\|jpg\|gif\|pdf\)'

请注意,在.之后包含.*以匹配每个相关类型的文件扩展名和转义字符前的字符。

请记住,您正在否定regEx以排除所提及的扩展名的文件。要实际列出仅需要这些扩展名的文件,请将!删除为

find . -regex '.*\.\(jpeg\|jpg\|gif\|pdf\)'

答案 1 :(得分:1)

  

好像它无法识别正则表达式组

这正是发生的事情。

你的正则表达式没有任何问题,但它是用find期望的PCRE或ERE方言写的。如果您告诉find将其解释为ERE,则会按预期匹配:

# GNU
find . -regextype posix-extended ! -regex ".*(jpeg|jpg|gif|pdf)+$"

# macOS
find . -E ! -regex ".*(jpeg|jpg|gif|pdf)+$"

默认情况下,它在Perl,Java,RE2,egrep,bash =~awk以及许多其他使用PCRE或ERE的工具中也可以正常工作

但是,它在Emacs或BRE中不起作用,这是GNU和macOS分别期望的。

Inian的解决方案是将您的模式从ERE样式重写为Emacs样式,其中\(\|\)代替(|)(以及对其进行其他改进)。

tl; dr:将正则表达式从一个工具复制粘贴到另一个工具就像将函数从Java复制粘贴到C#。它们看起来非常相似,甚至可能有效,但它可能至少需要一些调整。

相关问题