Linux «find -regex» не обрабатывает привязку

Linux «find -regex» не обрабатывает привязку

У меня есть следующие файлы, и мне нужно сопоставить их следующим образом:

./foo.bar1.sh       -match

./qux/foo.bar2.sh   -match

./foo.sh            -match

./baz.sh            -no match

./foo.bar3          -no match

Я пытался:

find . -regex ".*foo(bar[0-9])?\.sh"

Но ничего не возвращает. Я не могу понять, почему это регулярное выражение не работает.

решение1

В вашем регулярном выражении есть две ошибки:

  1. После „пропущена“ (буквальная) точка foo.

  2. findтребует от вас экранировать скобки, когданетиспользуются как буквальные скобки.

Кроме того, следует экранировать точку перед sh, так как она будет соответствовать любому символу.

Исправленная команда теперь выглядит так:

find . -regex ".*foo\(\.bar[0-9]\)?\.sh"

Ошибка 2, кстати, является причиной, по которой мне не нравится findswitch -regex: непоследовательное экранирование.

Конечно, он работает, но grep -Pиспользует Perl-совместимые регулярные выражения (PCRE), поэтому функций больше, но сюрпризов и подводных камней меньше.

Лично я бы использовал:

find . | grep -P "foo(\.bar\d)?\.sh"

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