使用正则表达式进行文件匹配,而不是字符串匹配

使用正则表达式进行文件匹配,而不是字符串匹配

我试图弄清楚如何使用grep来搜索特定字符串(为了简单起见)"9",并且我想在包含字符 的所有文件上搜索这个字符串,再次为了简单起见b

我试过了grep -e "9" b,但它说找不到文件b。 (如果我不使用该选项,则相同-e)。

我知道我可以这么做grep -e "9" *b*,但这不是我的重点。我想要使​​用正则表达式的常用工具来进行文件名匹配。

我对获得这个的复杂方法不感兴趣。我希望有一个简单的选项grep可以用于此目的。我仔细阅读了man,但找不到任何有用的东西,但我对 shell 脚本还很陌生,所以我很容易会错过它。

是否可以使用正则表达式进行文件名匹配只是 grep?如果是这样,怎么办?

答案1

其本身没有选项grep可以使用正则表达式来匹配文件。

您有两个选择:

  1. 使用 shell glob,例如

    grep -e '9' b*
    

    上面是非常简单的示例,但是您可以匹配非常奇特的文件名,特别是如果您使用某些扩展机制。下面列出了一些bash可以打开的有用功能,类似的功能可以在zsh其他 shell 中找到:

    • globstar(用于**匹配整个目录树)
    • nocaseglob(不区分大小写的匹配)
    • extglob(扩展模式:?(), @(), !(), *(), +()
    • nullglob(不匹配的模式扩展为空字符串)
  2. 用于find搜索文件并从中执行grep

    find . -name 'b*' -exec grep '9' {} +
    

    或者如果需要正则表达式:

    find . -regex './b.*' -exec grep '9' {} +
    

    这种方法的优点是你可以添加另一个开关来find选择文件,不仅可以按名称,还可以按日期、大小等。这不能用标准 shell 的 glob 来完成,除非你使用zsh它的强大功能全局限定符

相关内容