У меня есть список .jpg файлов в моем текущем каталоге со следующими путями:
./ex.jpg
./ex1234.jpg
./ex4321.jpg
И я пытаюсь соответствовать только тем, которые содержат числа с регулярными выражениями и find
команда. Вот команда, которую я выполняю:
find . -regextype posix-egrep -regex "\.\/ex\d+\.jpg"
Однако это ничему не будет соответствовать в моем каталоге. И еще более странный то, что следующая команда (замена \d+
с \d*
):
find . -regextype posix-egrep -regex "\.\/ex\d*\.jpg"
выводы только это:
./ex.jpg
Я попробовал это регулярное выражение, изменяющееся -regextype
управляйте ко всем другим доступным опциям, но это, кажется, не оказывает влияния.
Кто-то может объяснить это поведение?
Моя версия find
: (GNU findutils) с 4.7.0 мерзавцами в Ubuntu 16.04.3 LTS для Windows Subsystem для Linux.
\d
(для десятичной цифры) не поддерживается синтаксисом расширенного регулярного выражения (ERE) POSIX (или GNU grep) - как вы можете легко это подтвердить:
$ echo 'foo1234bar' | grep -E '\d'
Фактически \d
происходит из perl
, а поддерживается GNU grep в режиме PCRE (регулярное выражение, совместимое с perl):
$ echo 'foo1234bar' | grep -P '\d'
foo1234bar
Однако это не сильно помогает в find
, так как AFAIK он еще не предоставляет PCRE regextype
- вам придется использовать простой диапазон символов [0-9]
, который поддерживается как ERE, так и базовыми регулярными выражениями (BRE):
find . -regextype posix-egrep -regex "\.\/ex[0-9]+\.jpg"
Причина, по которой \d*\.jpg
соответствует ex.jpg
, заключается в том, что \d
рассматривается как литерал d
- и ноль или более чего-либо соответствует всему.