為什麼以下查找正規表示式在 Linux 上不起作用?

為什麼以下查找正規表示式在 Linux 上不起作用?

我正在嘗試查找與特定模式匹配的文件,但是嘗試運行下面的命令不會返回任何結果,即使存在應該與該模式匹配的文件。

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

我知道.*/要匹配整個路徑,但不太明白這到底意味著什麼。

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

  1. s_choose_blue.png
  2. s_choose_red.png
  3. s_new_blue.png

答案1

正規表示式的實際問題是它與應該匹配的內容不符。分解它:

  • .*/– 任何字符,多次,後跟斜線。這基本上會消耗實際文件名之前的目錄列表,因此它會字面匹配./(如您的示例中所示),./some/other/dir/直到最後一個斜杠。

    這是有效的,因為正規表示式預設是“貪婪的”,這意味著它們盡可能匹配。本質上,這部分允許您只搜尋實際的檔案名稱並從結果中移除路徑。

    總而言之,.*/如果您關心的是實際文件名,則需要在正規表示式前面添加 。如果您還需要符合檔案路徑的某些部分,則不能使用.*/

  • s_– 這在你的例子中效果很好

  • [a-zA-Z]– 這只消耗這個班級的人物

  • _– 後跟底線

  • [a-zA-Z]– 再次跟隨特點

  • \.png– 從字面上匹配點和擴展名

因此,您必須將正規表示式變更為:

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

您必須使用+,它基本上表示前一個或多個。

相關內容