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'.'' 存在两个问题:
- 语法错误:变量赋值时不能直接嵌套命令,正确的命令替换应该用反引号或
$()包裹; - 逻辑错误:
cut -f1 -d'.'仅按点分割取第一个字段,得到的是ODRD_AzureData_Linux_x64_19.1.0.0.7,并没有分离名称和版本——因为名称与版本的分隔符是下划线,不是点。
内容的提问来源于stack exchange,提问作者harsha32 n
相关产品推荐
相关产品推荐

