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

使用sed替换文件名中最后一个点外的所有点失败,求问题分析

问题分析与解决

你的sed脚本没有生效的核心原因是:默认sed使用基础正则表达式(BRE),不支持(?=...)这种Perl兼容正则(PCRE)的正向预查语法,导致匹配规则完全不工作,所以没有任何替换发生。

两种可行的修复方案:

方案1:启用扩展正则表达式(推荐)

给sed添加-E参数(GNU/BSD/macOS sed通用),让它支持正向预查语法:

echo "test.test.test.txt" | sed -E "s/\.(?=.*\.)/-/g"

执行后就能得到预期结果:test-test-test.txt

方案2:无预查的兼容写法(适配所有sed版本)

如果需要兼容所有sed环境,可以用临时标记的思路绕开预查:

echo "test.test.test.txt" | sed -e 's/\(.*\)\./\1@@@/' -e 's/\./-/g' -e 's/@@@/\./'

步骤解释:

  1. s/\(.*\)\./\1@@@/:将文件名中最后一个.替换为临时标记@@@
  2. s/\./-/g:把剩余所有.替换为-
  3. s/@@@/\./:把临时标记换回.

内容的提问来源于stack exchange,提问作者Gerco-Kees

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:02:37