You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

期望提取结果:

应用名:

  1. name-of-application-1
  2. app-name2
  3. another-application
  4. yet-another-example-4

版本号:

  1. 1.2.3
  2. 999.2.31
  3. 123.456.789
  4. 0.0.1

扩展名:

  1. "AppImage"
  2. "AppImage"
  3. ""
  4. "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

关键逻辑说明

  1. 扩展名处理:通过*.*判断是否存在扩展名,用${filename##*.}提取扩展名,${filename%.*}保留去掉扩展名后的主体部分。
  2. 正则匹配核心:^(.*)-[vV]([0-9]+\.[0-9]+\.[0-9]+)$精准匹配文件名结构:
    • ^(.*):捕获版本号前缀之前的所有内容作为应用名
    • -:匹配版本号前缀前的连字符
    • [vV]:兼容大小写的版本前缀
    • ([0-9]+\.[0-9]+\.[0-9]+):捕获三段式数字组成的版本号
  3. 变量作用域优化:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 14:34:52