Почему \d метасимвол не работает в команде находки с-regextype posix-egrep активный?

У меня есть список .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.

2
задан 10 November 2017 в 22:39

1 ответ

\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 - и ноль или более чего-либо соответствует всему.

3
ответ дан 2 December 2019 в 02:45

Другие вопросы по тегам:

Похожие вопросы: