【问题标题】:Using non-consuming matches in Linux find regex在 Linux 中使用非消耗匹配查找正则表达式
【发布时间】:2011-02-09 05:14:39
【问题描述】:

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

创建一些测试文件:

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

我有一个返回所有 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 命令被假定为我们工具其他部分的输入。

【问题讨论】:

    标签: regex linux find


    【解决方案1】:

    这在 linux 上可以满足您的需求:

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

    我不确定“!”运算符是 gnu find 独有的。

    【讨论】:

      【解决方案2】:

      不确定您需要什么转义或环视是否有效,但这些适用于 Perl:

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

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

      编辑 - 刚刚检查了 find 命令,你可以对 find 做的最好的事情是将 regextype 更改为 -regextype posix-extended ,但这不会做环顾之类的事情。解决这个问题的唯一方法似乎是使用一些 gnu 的东西,无论是 @unholygeek 建议使用 find 还是使用 -P perl 选项将 find 管道化到 gnu grep 中。如果您使用 gnu grep,则可以逐字使用上述正则表达式。类似find .... -print | xargs grep -P ...

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

      【讨论】:

      • 我尝试了这些表达式并尝试了各种转义,但我无法让它们在查找正则表达式中工作。 :-(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      相关资源
      最近更新 更多