如何用Bash脚本从文件名提取应用名、版本号及扩展名?
Bash脚本解析文件名:提取应用名、版本号和扩展名
需求说明
需要从以下格式的文件名中提取应用名、版本号(前缀为v/V)及可选扩展名:
- name-of-application-1-v1.2.3.AppImage
- app-name2-V999.2.31.AppImage
- another-application-v123.456.789
- yet-another-example-4-V0.0.1.extA
期望提取结果:
应用名:
- name-of-application-1
- app-name2
- another-application
- yet-another-example-4
版本号:
- 1.2.3
- 999.2.31
- 123.456.789
- 0.0.1
扩展名:
- "AppImage"
- "AppImage"
- ""
- "extA"
原脚本问题
生成的脚本未输出正确结果,错误输出如下:
Running script: ./filename-parser.sh Processing filename: name-of-application-1-v1.2.3.AppImage Base name: name-of-application-1-v1.2.3 Version number: Extension: Processing filename: app-name2-V999.2.31.AppImage Base name: app-name2-V999.2.31 Version number: Extension: Processing filename: another-application-v123.456.789 Base name: another-application-v123.456 Version number: Extension: Processing filename: yet-another-example-4-V0.0.1.extA Base name: yet-another-example-4-V0.0.1 Version number: Extension:
解决方案:Bash完全可行
不需要改用Python,通过调整正则匹配和字符串处理逻辑即可实现需求。以下是修正后的脚本:
#!/bin/bash parse_filename() { # 提取纯文件名(去掉路径) local filename="${1##*/}" local app_name="" local version="" local extension="" # 处理扩展名:存在.则提取,否则设为空 if [[ "$filename" == *.* ]]; then extension="${filename##*.}" filename="${filename%.*}" else extension="" fi # 正则匹配提取应用名和版本号:匹配末尾的-v/V+三段式数字版本格式 if [[ "$filename" =~ ^(.*)-[vV]([0-9]+\.[0-9]+\.[0-9]+)$ ]]; then app_name="${BASH_REMATCH[1]}" version="${BASH_REMATCH[2]}" fi # 按需求格式输出结果 echo "应用名:$app_name" echo "版本号:$version" echo "扩展名:\"$extension\"" echo } echo "Running script: $0" echo # 遍历传入的所有文件名 for file in "$@"; do echo "Processing filename: $file" parse_filename "$file" done
关键逻辑说明
- 扩展名处理:通过
*.*判断是否存在扩展名,用${filename##*.}提取扩展名,${filename%.*}保留去掉扩展名后的主体部分。 - 正则匹配核心:
^(.*)-[vV]([0-9]+\.[0-9]+\.[0-9]+)$精准匹配文件名结构:^(.*):捕获版本号前缀之前的所有内容作为应用名-:匹配版本号前缀前的连字符[vV]:兼容大小写的版本前缀([0-9]+\.[0-9]+\.[0-9]+):捕获三段式数字组成的版本号
- 变量作用域优化:使用
local声明函数内变量,避免全局变量污染导致的逻辑错误。
测试运行
执行脚本并传入测试文件名:
./filename-parser.sh name-of-application-1-v1.2.3.AppImage app-name2-V999.2.31.AppImage another-application-v123.456.789 yet-another-example-4-V0.0.1.extA
输出结果将完全符合期望:
Running script: ./filename-parser.sh Processing filename: name-of-application-1-v1.2.3.AppImage 应用名:name-of-application-1 版本号:1.2.3 扩展名:"AppImage" Processing filename: app-name2-V999.2.31.AppImage 应用名:app-name2 版本号:999.2.31 扩展名:"AppImage" Processing filename: another-application-v123.456.789 应用名:another-application 版本号:123.456.789 扩展名:"" Processing filename: yet-another-example-4-V0.0.1.extA 应用名:yet-another-example-4 版本号:0.0.1 扩展名:"extA"
内容的提问来源于stack exchange,提问作者Simon Bagley
相关产品推荐
相关产品推荐

