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

4

Com o comando GNU find ( GNU findutils 4.4.2 ), uma expressão regular pode ser usada para procurar por 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 o grupo de captura definido por essa expressão e usá-lo em um argumento -printf ?

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

Isso é possível?

    
por starfry 26.06.2014 / 13:08

2 respostas

2

Uma alternativa para a resposta do l0b0 (menor, mas potencialmente menos eficiente):

Assumindo um (recente) GNU sed :

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

Observe que a parte cara de find é a caminhada pela árvore, o que ela terá que fazer de qualquer forma, se você tiver -regex ou não. Então, aqui, estamos fazendo a correspondência e o relatório em sed .

    
por 26.06.2014 / 14:06
4

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 o GNU grep também), ele deve funcionar para qualquer caminho. O regex não permite novas linhas, então não há como fazer com que ele corresponda, por exemplo, a um diretório contendo um nome similar.

    
por 26.06.2014 / 13:39