можно ли использовать группы захвата регулярных выражений в команде GNU find?

можно ли использовать группы захвата регулярных выражений в команде GNU find?

С помощью команды GNU find(GNU findutils 4.4.2), регулярное выражение может быть использовано для поиска файлов. Например:

$ find pool -regextype posix-extended -regex ".*/mypackage-([a-zA-Z0-9.]+-[0-9]{1,2})-x86_64.pkg.tar.xz+"

Возможно ли извлечьгруппа захватаопределяется этим выражением и использовать его в -printfаргументе?

Итак, имея найденный файл с именем pool/mypackage-1.4.9-1-x86_64.pkg.tar.xz, я хотел бы включить его 1.4.9-1часть в printfвыражение.

Это возможно?

решение1

Если вы используете

find pool -regextype posix-extended \
    -regex ".*/mypackage-([a-zA-Z0-9.]+-[0-9]{1,2})-x86_64\.pkg\.tar\.xz" \
    -printf '%f\n' |
  grep -Eo '[a-zA-Z0-9.]+-[0-9]{1,2}'

(предполагая также GNU grep), это должно работать для любого пути. Регулярное выражение не допускает никаких новых строк, поэтому нет способа заставить его соответствовать, например, каталогу, содержащему похожее имя.

решение2

Альтернатива прекрасному ответу l0b0 (короче, но потенциально немного менее эффективная):

Предположим, что у нас есть (последняя) версия GNU sed:

find pool -print0 |
  sed -znE 's|.*/mypackage-([[:alnum:].]+-[0-9]{1,2})-x86_64\.pkg\.tar\.xz$|\1|p'|
  tr '\0' '\n'

Обратите внимание, что дорогостоящая часть find— это обход дерева, который придется делать в любом случае, независимо от того, есть у вас это -regexили нет. Поэтому здесь мы делаем сопоставление и отчетность sedвместо этого.

Связанный контент