können Regex-Erfassungsgruppen im GNU-Find-Befehl verwendet werden?

können Regex-Erfassungsgruppen im GNU-Find-Befehl verwendet werden?

Mit dem GNU- findBefehl (GNU Findutils 4.4.2) kann ein regulärer Ausdruck zum Suchen nach Dateien verwendet werden. Beispiel:

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

Ist es möglich, dieErfassungsgruppedurch diesen Ausdruck definiert und in einem Argument verwendet -printf?

Bei einer gefundenen Datei mit dem Namen pool/mypackage-1.4.9-1-x86_64.pkg.tar.xzmöchte ich den 1.4.9-1Teil in einen printfAusdruck einschließen.

Ist das möglich?

Antwort1

Wenn du benutzt

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

( grepauch unter der Annahme von GNU) sollte es für jeden Pfad funktionieren. Der reguläre Ausdruck lässt keine Zeilenumbrüche zu, daher gibt es keine Möglichkeit, ihn beispielsweise mit einem Verzeichnis abzugleichen, das einen ähnlichen Namen hat.

Antwort2

Eine Alternative zur guten Antwort von l0b0 (kürzer, aber möglicherweise etwas weniger effizient):

Unter der Annahme eines (neueren) GNU sed:

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

Beachten Sie, dass der aufwändige Teil finddas Heruntergehen des Baums ist, was ohnehin erforderlich ist, ob Sie es nun tun -regexoder nicht. Deshalb führen wir hier sedstattdessen das Zuordnen und Melden durch.

verwandte Informationen