在Linux中使用非消费匹配找到正则表达式

时间:2011-02-08 00:56:55

标签: regex linux find

这是我在简化场景中的问题。

创建一些测试文件:

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

我有一个find表达式,它返回所有XML和INI文件:

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

我现在想要一种修改此-regex的方法,以排除excludeme.xml文件包含在结果中。

我认为应该可以通过使用/组合非消费正则表达式(?=expr)和否定匹配(?!expr)来实现这一点。不幸的是我无法正确获取命令的格式,所以我的尝试导致没有返回匹配。这是我的一次尝试(我已经尝试了许多不同形式的这种与不同的逃避!):

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

我无法将命令分解为多个步骤(例如,通过grep -v进行管道传输),因为find命令被假定为我们工具其他部分的输入。

2 个答案:

答案 0 :(得分:3)

这就是你想要的linux:

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

我不确定“!”运算符是gnu find的唯一选择。

答案 1 :(得分:0)

不确定你需要什么逃脱或者看起来有效,但这些适用于Perl:

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

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

编辑 - 刚刚查看了find命令,你可以用find做的最好是将regextype更改为-regextype posix-extended但是不要做像浏览这样的事情。解决这个问题的唯一方法就是使用一些gnu的东西,或者@unholygeek建议使用find或使用-P perl选项找到gnu grep。如果你使用gnu grep,你可以逐字使用上面的正则表达式。像find .... -print | xargs grep -P ...

这样的东西

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