如何使用shell脚本按最后一个分隔符提取文件名的左右两部分
Shell按最后一个分隔符拆分文件名的最优实现
直接用Shell内置的参数扩展即可完成,不需要调用sed/awk/cut等外部工具,性能最高,且兼容所有符合POSIX标准的Shell环境(bash/zsh/dash/ash均支持)。
示例代码
# 定义文件名变量 filename='test_testone_test3_1234' # 提取最后一个下划线之前的内容 file="${filename%_*}" # 提取最后一个下划线之后的内容 seq="${filename##*_}"
执行后变量$file和$seq的值就是你需要的结果。
语法说明
${变量%模式}:从变量内容的尾部开始匹配最短的符合规则的字符串,删除匹配部分后返回剩余内容。%_*即匹配从尾部开始第一个下划线及之后的所有内容,删除后就得到最后一个分隔符之前的部分。${变量##模式}:从变量内容的头部开始匹配最长的符合规则的字符串,删除匹配部分后返回剩余内容。##*_即匹配从开头到最后一个下划线的所有内容,删除后就得到最后一个分隔符之后的部分。
如果需要更换分隔符,只需要把上述语法中的_替换为你需要的分隔符即可,比如按.拆分文件名和后缀的写法就是${filename%.*}和${filename##*.},是Shell中非常常用的写法。
其他可选方案(不推荐批量场景使用)
如果你需要用awk实现也可以,写法如下:
echo "$filename" | awk -F '_' '{seq=$NF; $NF=""; sub(/_$/, "", $0); file=$0} END{print "file=" file, "seq=" seq}'
该方案需要调用外部awk命令,单个文件处理差异不大,批量处理大量文件时性能远低于内置参数扩展方案。
内容的提问来源于stack exchange,提问作者N9909
相关产品推荐
相关产品推荐

