find в linux не хочет использовать ретроспективные и опережающие regex запросы
Заметил, что почему-то find на ubuntu 24 при выставленных в строку параметрах
find /etc -regextype posix-extended -regex '/.*/patron(?!u).*' 2>/dev/null
или же
find /etc -regextype posix-extended -regex '.*(?<!patroni)/pat[^/].+$' 2>/dev/null
не отрабатывает как положено. При сравнении с подобным же запросом на песочницах regex поиск отрабатывает адекватно. В чем может быть проблема?
Ответы (1 шт):
Этот поиск выдаёт ошибку, потому что при -regextype posix-extended нельзя использовать знак вопроса после открывающей скобки группы (, см. документацию:
‘*’, ‘+’ and ‘?’ are special at any point in a regular expression except the following places, where they are not allowed:
- At the beginning of a regular expression
- After an open-group, signified by ‘(’
- After the alternation operator ‘|’
Собственно, опережающий и ретроспективный поиск в документации не упоминается. Чтобы его использовать, вам нужна подходящая утилита, например, grep --perl-regexp:
find /etc -type f | grep --perl-regexp '.*(?<!patroni)/pat[^/].+$'
Альтернатива - фильтровать в два шага. Поскольку вы используете опережение и ретроспективу чтобы отфильтровать некоторые строки, то первым шагом выбираете то, что нужно наверняка, а вторым - убираете лишнее. Например:
find /etc -type f -regex '.*/pat[^/].+' | grep --invert-match 'patroni/pat'