Shell脚本中如何从文件名中提取排除日期部分的目标名称
Shell提取文件名去除日期部分的实现方案
针对aaa_djdidm_cjcjcj_20220602.txt这类文件名,目标是提取去掉末尾8位日期和后缀后的前缀aaa_djdidm_cjcjcj,以下是几种可直接在Shell脚本中使用的实现方式:
内置参数扩展实现(优先推荐,无外部命令依赖,执行效率最高)
不需要调用sed、awk等外部工具,纯Shell内置语法即可完成:# 赋值目标文件名 file_name="aaa_djdidm_cjcjcj_20220602.txt" # 先移除.txt后缀 temp=${file_name%.txt} # 再移除末尾的_加8位日期部分 target_name=${temp%_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]} # 输出结果:aaa_djdidm_cjcjcj echo $target_name这里的
${var%pattern}语法作用是从变量值的末尾删除最短匹配pattern的内容,用[0-9]匹配数字可以精准定位日期段,避免误删其他8位非日期字符。如果确定日期部分一定是8位任意字符、不需要校验数字格式,也可以把匹配规则简化为${temp%_????????}。sed正则匹配实现(适合批量处理文件场景)
通过正则匹配末尾固定格式的日期+后缀,直接替换为空得到结果:file_name="aaa_djdidm_cjcjcj_20220602.txt" target_name=$(echo "$file_name" | sed 's/_[0-9]\{8\}\.txt$//') echo $target_name正则里的
$表示匹配字符串末尾,能确保只会删除文件名最末尾的日期和后缀,不会误改文件名中间的同名结构。awk字段拆分实现(适合下划线分隔规则固定的场景)
如果文件名始终以下划线作为分隔符,且日期固定是倒数第二个字段、后缀固定为.txt,可以用awk拆分字段后重组:file_name="aaa_djdidm_cjcjcj_20220602.txt" target_name=$(echo "$file_name" | awk -F'_' '{$NF="";sub(/_ $/,"");print}' OFS='_') echo $target_name逻辑是按下划线拆分字段后清空最后一个字段(即日期+.txt的部分),再删掉末尾残留的下划线,最后用下划线拼接剩余字段输出。
使用提示:如果实际文件名的日期位置、长度、后缀和示例有差异,对应调整匹配规则即可,建议先拿测试样本验证输出符合预期再写入正式脚本。
内容的提问来源于stack exchange,提问作者Kartik
相关产品推荐
相关产品推荐

