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

Shell脚本中按下划线分割文件名提取名称与版本求助

提取文件名中的名称和版本字段

针对你提到的文件名格式(如ODRD_AzureData_Linux_x64_19.1.0.0.7.tar),需要提取最后一个下划线之前的内容作为名称,下划线之后、.tar之前的内容作为版本,以下是几种可行的解决方案:

方法一:Bash 参数扩展(推荐,无需外部工具)

利用 Bash 内置的字符串处理功能,无需调用额外命令,效率更高:

filename="ODRD_AzureData_Linux_x64_19.1.0.0.7.tar"
# 先去掉末尾的 .tar 后缀
base_name="${filename%.tar}"
# 提取最后一个下划线之前的所有内容作为名称
app_name="${base_name%_*}"
# 提取最后一个下划线之后的内容作为版本
app_version="${base_name#*_}"

echo "名称:$app_name"
echo "版本:$app_version"

执行后输出:

名称:ODRD_AzureData_Linux_x64
版本:19.1.0.0.7

方法二:使用 awk 处理

通过指定分隔符为下划线和点,拆分字段后重组名称、提取版本:

filename="ODRD_AzureData_Linux_x64_19.1.0.0.7.tar"
echo "$filename" | awk -F'[_.]' '{
    # 版本是倒数第二个字段(最后一个字段是 tar)
    version = $(NF-1)
    # 拼接前 N-2 个字段作为名称,中间补下划线
    name = $1
    for(i=2; i<=NF-2; i++) {
        name = name "_" $i
    }
    print "名称:" name
    print "版本:" version
}'

方法三:使用 sed 处理

通过正则表达式匹配并捕获目标字段:

filename="ODRD_AzureData_Linux_x64_19.1.0.0.7.tar"
echo "$filename" | sed -E 's/^(.*)_(.*)\.tar$/名称:\1\n版本:\2/'

正则说明:^(.*)_ 捕获最后一个下划线之前的所有内容,(.*)\.tar$ 捕获下划线之后到 .tar 之前的版本字符串。

原命令的问题分析

你之前使用的 name='$filename | cut -f1 -d'.'' 存在两个问题:

  1. 语法错误:变量赋值时不能直接嵌套命令,正确的命令替换应该用反引号或$()包裹;
  2. 逻辑错误:cut -f1 -d'.' 仅按点分割取第一个字段,得到的是ODRD_AzureData_Linux_x64_19.1.0.0.7,并没有分离名称和版本——因为名称与版本的分隔符是下划线,不是点。

内容的提问来源于stack exchange,提问作者harsha32 n

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:01:35