为什么以下正则表达式在 Linux 上不起作用?

为什么以下正则表达式在 Linux 上不起作用?

我正在尝试查找与特定模式匹配的文件,但是尝试运行以下命令不会返回任何结果,即使存在与该模式匹配的文件。

find . -maxdepth 1 -regextype posix-extended -regex ".*/s_[a-zA-Z]_[a-zA-Z]\.png" -exec echo {} \;

我知道.*/匹配整个路径但不太明白这到底意味着什么。

它必须匹配的文件例如包括

  1. 选择蓝色
  2. 选择红色
  3. 蓝色

答案1

您的正则表达式的实际问题是它与应该匹配的内容不匹配。分解如下:

  • .*/– 任意字符,多次,后跟斜线。这基本上会消耗实际文件名之前的目录列表,因此它会逐字匹配./(如您的示例所示),但也会匹配./some/other/dir/,直到最后一个斜线。

    这是可行的,因为正则表达式默认是“贪婪的”,这意味着它们会尽可能地匹配。本质上,这部分允许您只搜索实际的文件名并从结果中去除路径。

    总而言之,.*/如果您只关心实际文件名,则需要在正则表达式前面加上。如果您还需要匹配文件路径的某些部分,则不能使用.*/

  • s_– 在您的示例中,这很好用

  • [a-zA-Z]– 这仅消耗来自此类的角色

  • _– 后跟下划线

  • [a-zA-Z]– 再次特点

  • \.png– 逐字匹配点和扩展名

因此,您必须将正则表达式更改为:

.*/s_[a-zA-Z]+_[a-zA-Z]+\.png

您必须使用+,它基本上表示前一个的一个或多个。

相关内容