这是我在简化场景中的问题。
创建一些测试文件:
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命令被假定为我们工具其他部分的输入。
答案 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 ...
对不起,这是我能做的最好的事情。