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

С помощью команды find GNU ( 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 .

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

  • Как заменить это регулярное выражение на пустое, используя sed
  • Использование \ $ в конце имени переменной передается grep
  • Как использовать аргумент командной строки как выражение соответствия rexx awk?
  • заменяя третье вхождение шаблона, используя sed
  • Найти только в каталогах n уровней
  • Удаление текста из файла с использованием регулярных выражений
  • regex find заменяет строки, начинающиеся или начинающиеся с обратной косой черты
  • Удаление цветовых кодов из вывода
  • 2 Solutions collect form web for “могут ли группы захвата регулярных выражений использоваться в команде поиска GNU?”

    Альтернатива тонкому ответу 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 .

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

     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 ), он должен работать для любого пути. Регулярное выражение не допускает никаких новых строк, поэтому нет возможности сопоставить его, например, каталог, содержащий аналогичное имя.

    Linux и Unix - лучшая ОС в мире.