Bash编写仅匹配数字与点的正则 筛选复制指定版本jar文件
匹配任意段版本号、排除带
-extra后缀Jar文件的实现方案 方案1:使用Shell扩展通配(无管道,写法最简洁)
Bash环境下可以直接开启扩展通配功能,不需要调用grep、awk等额外命令,一条指令即可完成复制:
# 开启当前会话的扩展通配能力 shopt -s extglob cp folder1/filename-+([0-9.]).jar otherfolder/
语法说明:
+([0-9.])是扩展通配规则,代表匹配1个及以上由数字、半角点组成的字符,刚好适配任意段数、任意位数字的版本号格式- 带
-extra后缀的文件因为包含横杠、英文字母,不在[0-9.]的匹配范围内,会被自动排除 - 操作完成后如果需要恢复默认通配规则,执行
shopt -u extglob即可
方案2:使用Grep正则过滤(全Shell环境兼容)
如果不想修改Shell默认配置,可以用扩展正则写匹配规则,适配任意段版本号,配合xargs完成复制:
ls folder1/ | grep -E "filename-[0-9]+(\.[0-9]+)*\.jar$" | xargs -I {} cp folder1/{} otherfolder/
正则规则说明:
- 加
-E参数开启扩展正则模式,不需要写大量冗余转义符 [0-9]+匹配版本号的第一段数字,支持多位数字(比如32、430)(\.[0-9]+)*匹配0次及以上「半角点+数字」的组合,不管版本号是2段、3段还是更多段都能覆盖- 末尾加
$锚定行尾,确保文件名以.jar结尾,从规则上排除后面带-extra等额外后缀的文件
常见失效写法原因
- 基础通配
cp folder1/filename-*.jar otherfolder/:*会匹配任意长度的任意字符,会同时命中带-extra后缀的文件 - 通配写法
filename-[0-9.].jar:基础通配里的[0-9.]仅匹配单个数字或半角点,无法匹配多字符组成的完整版本号 - 固定三段正则
filename-[0-9]\.[0-9]\.[0-9]\.jar:写死了版本号的段数,遇到多段版本、多位数字版本的场景就会漏匹配
内容的提问来源于stack exchange,提问作者covfefe
相关产品推荐
相关产品推荐

