如何使用sed将文件内路径的指定部分替换为当前目录路径
sed路径替换匹配失败解决方案
原命令失败原因
你的命令存在3个核心问题:
- sed默认使用基础正则表达式(BRE),
+量词在BRE中无特殊匹配含义,需转义为\+或开启扩展正则支持 - 整个匹配规则使用单引号包裹,
$PWD属于shell变量,单引号会阻止变量解析,无法替换为实际当前路径 - 正则写法逻辑错误:
.+为贪婪匹配,会匹配到尽可能长的内容,可能跨多个路径段匹配,且你把正则拆成了多段单引号拼接,规则本身已经断裂。
可用替换命令
通用测试写法(兼容GNU sed、BSD sed)
sed -E "s,/build/[^/]+/[0-9]+/,$PWD/,g" 目标文件名
你可以先执行测试验证效果:
echo "/build/8b7yrg_k/12/src/main/myfile" | sed -E "s,/build/[^/]+/[0-9]+/,$PWD/,g"
若当前工作目录为/build/home/0/,会直接输出预期结果/build/home/0/src/main/myfile。
原地修改文件
- GNU sed(Linux系统默认):
sed -i -E "s,/build/[^/]+/[0-9]+/,$PWD/,g" 目标文件名
- BSD sed(macOS系统默认):
sed -i '' -E "s,/build/[^/]+/[0-9]+/,$PWD/,g" 目标文件名
规则说明
-E:开启扩展正则表达式支持,可直接使用+量词无需转义- 双引号包裹规则:保证shell正常解析
$PWD变量为当前工作目录实际值 [^/]+:匹配任意非斜杠字符,精准匹配构建ID段,不会跨路径段贪婪匹配- 规则末尾的
/:保证替换后的路径拼接格式正确,避免出现路径多斜杠或少斜杠的问题
内容的提问来源于stack exchange,提问作者Jimmy Fraiture
相关产品推荐
相关产品推荐

