2

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

./foo.bar1.sh       -match

./qux/foo.bar2.sh   -match

./foo.sh            -match

./baz.sh            -no match

./foo.bar3          -no match

Я пытался:

находить . -regex ". * foo(bar [0-9])?. sh"

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

1 ответ1

2

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

  1. Он пропускает (буквальную) точку после foo .

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

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

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

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

Кстати, именно из-за ошибки мне не нравится параметр find -regex : несогласованное экранирование.

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .