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 шт):

Автор решения: Vitalizzare ушел в монастырь

Этот поиск выдаёт ошибку, потому что при -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'
→ Ссылка