有一个文件夹,其中包含两个文件,例如:filename-3.0.1-extra.jar
和 filename-3.0.1.jar
。中间的数字和点是版本,可以更改。我正在尝试将 filename-3.0.1.jar
复制到另一个文件夹。
像这样的东西:
cp folder1/filename-*.jar otherfolder/
但是通配符 *
与两个文件都匹配。我试图仅复制文件,末尾不带 -extra
。因此,当我复制时,我尝试仅将文件名与数字和点相匹配,如下所示:
cp文件夹1/文件名-[0-9.].jar otherfolder/
。
但这不是正则表达式的正确语法。非常感谢这里的任何帮助!
更新:
我对此有所了解:
ls | grep -e "filename-[0-9]\.[0-9]\.[0-9]\.jar"
但是正则表达式似乎有点僵化。有没有办法将其缩短为类似 "filename-([0-9]+[\.])+jar"
?
这样即使像 filename-32.430.3.jar
这样的情况也会被捕获?
最佳答案
使用 extglob
你可以这样做:
shopt -s extglob
cp folder1/filename-+([0-9.]).jar otherfolder/
此处 +([0-9.])
将匹配 1 个或多个任意数字或点。
根据您编辑的问题,您似乎正在尝试将 grep
与正则表达式一起使用。您可以使用此 grep
解决方案:
printf '%s\n' *.* | grep -E '^filename-([0-9]+\.)+jar$'
filename-3.0.1.jar
关于string - Bash 正则表达式仅用于数字和点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72820446/