使用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/@@@/\./'
步骤解释:
s/\(.*\)\./\1@@@/:将文件名中最后一个.替换为临时标记@@@s/\./-/g:把剩余所有.替换为-s/@@@/\./:把临时标记换回.
内容的提问来源于stack exchange,提问作者Gerco-Kees
相关产品推荐
相关产品推荐

