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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 07:15:55