我从bash脚本开始,但这是我的问题
我一直在努力寻找。
当我find . ! -regex ".*(jpeg|jpg|gif|pdf)+$"
时
虽然实际上没有此扩展名的文件,但查找找不到任何内容。好像它不能识别正则表达式组
我找到了find . ! \( -name '*.jpeg' -o -name '*.jpg' -o -name '*.gif' \)
我的问题是:有没有更好的方法来做到这一点?
答案 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#。它们看起来非常相似,甚至可能有效,但它可能至少需要一些调整。