os grupos de captura regex podem ser usados ​​no comando GNU find?

os grupos de captura regex podem ser usados ​​no comando GNU find?

Com o findcomando GNU (GNU findutils 4.4.2), uma expressão regular pode ser usada para procurar arquivos. Por exemplo:

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

É possível extrair ogrupo de capturadefinido por essa expressão e usá-lo em um -printfargumento?

Portanto, dado um arquivo encontrado chamado pool/mypackage-1.4.9-1-x86_64.pkg.tar.xz, gostaria de incluir a 1.4.9-1parte em uma printfexpressão.

Isso é possível?

Responder1

Se você usar

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}'

(assumindo greptambém o GNU), deve funcionar para qualquer caminho. O regex não permite novas linhas, portanto não há como fazê-lo corresponder, por exemplo, a um diretório que contém um nome semelhante.

Responder2

Uma alternativa à boa resposta de l0b0 (mais curta, mas potencialmente um pouco menos eficiente):

Assumindo um (recente) GNU sed:

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

Observe que a parte cara findé descer da árvore, o que você terá que fazer de qualquer maneira, quer você tenha feito isso -regexou não. Então, aqui estamos fazendo a correspondência e o relatório sed.

informação relacionada