
У меня есть следующие файлы, и мне нужно сопоставить их следующим образом:
./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
В вашем регулярном выражении есть две ошибки:
После „пропущена“ (буквальная) точка
foo
.find
требует от вас экранировать скобки, когданетиспользуются как буквальные скобки.
Кроме того, следует экранировать точку перед sh
, так как она будет соответствовать любому символу.
Исправленная команда теперь выглядит так:
find . -regex ".*foo\(\.bar[0-9]\)?\.sh"
Ошибка 2, кстати, является причиной, по которой мне не нравится find
switch -regex
: непоследовательное экранирование.
Конечно, он работает, но grep -P
использует Perl-совместимые регулярные выражения (PCRE), поэтому функций больше, но сюрпризов и подводных камней меньше.
Лично я бы использовал:
find . | grep -P "foo(\.bar\d)?\.sh"