Почему следующее регулярное выражение не работает в 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

Вам придется использовать +, что по сути означает одно или несколько из предыдущего.

Связанный контент