【问题标题】:How to translate a pcre (php) regex pattern in bash?如何在 bash 中翻译 pcre (php) 正则表达式模式?
【发布时间】:2016-09-25 11:59:59
【问题描述】:

我有以下在 php 中运行良好的正则表达式模式

/(^((?!thumb).)*\.jpg)/

我的任务是在 bash 中翻译这个正则表达式,想法是从文件路径中不包含 thumb 单词的目录中(递归)查找所有 .jpg 文件。

我使用这样的结构:

find /folder/path -regex '(^((?!thumb).)*\.jpg)'

但我的结果为零?我在 bash 中的正则表达式有问题吗?

【问题讨论】:

  • 试试find /folder/path -regextype posix-extended -iregex '^((?!thumb).)*\\.jpg'
  • @ThomasAyoub 没有任何正则表达式类型支持仅 PCRE 功能。
  • 我收到了Invalid preceding regular expression
  • @AlexandruOlaru 以不同的方式重申我的上述评论,您不能将 PCRE 正则表达式与 find 一起使用。
  • 一般建议:不要试图将正则表达式风格“翻译”成另一种风格(用一种语言编写的代码与用另一种语言编写的代码相同)。如果你这样做,你会头疼并得到不好的结果。好的方法是:“模式/代码是什么?” (相对于“它是如何编写的?”或“使用什么技术?”) =>“如何使用这种语言/正则表达式风格/工具获得相同的结果?”

标签: php regex bash


【解决方案1】:

您不能对 find 使用负前瞻,因为它是 POSIX 正则表达式。您可以使用此解决方法:

find . -iname '*.jpg' | grep -v "thumb"

然后将列出所有jpg 文件,感谢grep 排除所有包含thumb 的文件

【讨论】:

    【解决方案2】:

    认为使用 find 获得的最佳效果是使用两个不同的标准而不是单个正则表达式

    find . -name '*.jpg' ! -regex '.*thumb.*'
    

    【讨论】:

      【解决方案3】:
      find . -iname '*.jpg' -not -iname "*thumb*"
      

      【讨论】:

        猜你喜欢
        • 2014-08-02
        • 1970-01-01
        • 1970-01-01
        • 2015-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多