sta*_*fry 4 find regular-expression
使用 GNUfind
命令(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+"
Run Code Online (Sandbox Code Playgroud)
是否可以提取该表达式定义的捕获组并在-printf
参数中使用它?
因此,给定一个名为 的找到的文件pool/mypackage-1.4.9-1-x86_64.pkg.tar.xz
,我想将该1.4.9-1
部分包含在printf
表达式中。
这可能吗?
如果你使用
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}'
Run Code Online (Sandbox Code Playgroud)
(假设也是 GNU grep
),它应该适用于任何路径。正则表达式不允许任何换行符,因此无法使其匹配,例如包含相似名称的目录。
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'
Run Code Online (Sandbox Code Playgroud)
请注意,最昂贵的部分find
是走下树,无论您-regex
是否有,它都必须这样做。因此,我们在这里进行匹配和报告sed
。