在Linux中使用非消耗的匹配find正则expression式

这是我简化的情况下的问题。

创build一些testing文件:

touch /tmp/test.xml touch /tmp/excludeme.xml touch /tmp/test.ini touch /tmp/test.log 

我有一个查找expression式,返回所有的XML和INI文件:

 [root@myserver] ~> find /tmp -name -prune -o -regex '.*\.\(xml\|ini\)' /tmp/test.ini /tmp/test.xml /tmp/excludeme.xml 

我现在想要一种修改这个-regex的方法来排除excludeme.xml文件被包含在结果中。

我认为这应该是可能的通过使用/组合非消耗正则expression式(?=expr)与否定匹配(?!expr) 。 不幸的是,我不能完全得到命令的格式,所以我的尝试导致没有匹配被返回。 这是我的一个尝试(我已经尝试了许多不同forms的这个不同的逃跑!):

 find /tmp -name -prune -o -regex '\(?=.*excludeme\.xml\).*\.\(xml\|ini\)' 

我不能将命令分解成多个步骤(例如,通过grep -vpipe道),因为find命令被假定为我们工具其他部分的input。

这就是你想要的Linux上:

 find /tmp -name -prune -o -regex '.*\.\(xml\|ini\)' \! -regex '.*excludeme\.xml' 

我不确定如果“!” 运营商是GNU独特的发现。

不知道你需要什么逃避,或者如果lookaround工作,但这些工作的Perl:

/^(?!.*\/excludeme\.).*\.(xml|ini)$/

/(?<!\/excludeme)\.(xml|ini)$/

编辑 – 只要选中查找命令,最好的办法就是将正则表达式改成-regextype posix-extended,但是不能做像查找的东西。 唯一的解决办法是使用一些GNU的东西,或者像@unholygeek用find或者管道在-P perl选项中找到gnu grep。 如果你使用gnu grep,你可以使用上面的正则表达式。 像find .... -print | xargs grep -P ...东西find .... -print | xargs grep -P ... find .... -print | xargs grep -P ...

对不起,这是我能做的最好的。