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

Sed替换图片src路径时虚拟机出现重复前缀问题求助

Sed替换图片路径出现重复前缀的解决方法

问题场景

原HTML代码行:

<div class="col-sm-6 col-md-4 col-lg-3"><figure> <img src='convert_IMG-20181121-WA0009.jpg' class="img-fluid galeria"></figure></div>

原生Linux执行Sed命令后得到正确结果:

<div class="col-sm-6 col-md-4 col-lg-3"><figure> <img src='/home/valentin/recetas/public_html/convert_IMG-20181121-WA0009.jpg' class="img-fluid galeria"></figure></div>

虚拟机中执行相同命令却出现路径重复:

<div class="col-sm-6 col-md-4 col-lg-3"><figure> <img src='/home/valentin/recetas/public_html//home/valentin/recetas/public_html/convert_IMG-20181121-WA0009.jpg' class="img-fluid galeria"></figure></div>

使用的Sed命令及变量定义:

BASEDIR=/home/valentin/recetas
PUBLIC_BASE=public_html
sed -i "s|img src='|img src='${BASEDIR}/${PUBLIC_BASE}/|" "${i}"

问题原因

核心原因是脚本被重复执行:虚拟机中的目标文件已经被处理过一次,再次执行Sed命令时,会把已经添加的前缀/home/valentin/recetas/public_html/前面的img src='再次匹配替换,导致路径被重复拼接。原生系统中是首次执行,所以结果正常。

解决方案

方案1:精准匹配相对路径,避免重复替换

修改Sed匹配规则,只对src值为相对路径(即img src='后第一个字符不是/)的行进行替换:

sed -i "s|img src='\([^/]\)|img src='${BASEDIR}/${PUBLIC_BASE}/\1|" "${i}"
  • 用\([^/]\)捕获img src='后第一个非/的字符,确保仅处理相对路径的图片标签,已替换为绝对路径的行不会被二次修改。

方案2:先检查是否已存在前缀,再决定是否替换

通过grep提前判断文件中是否已有目标路径前缀,仅当不存在时执行Sed替换:

grep -q "${BASEDIR}/${PUBLIC_BASE}/" "${i}" || sed -i "s|img src='|img src='${BASEDIR}/${PUBLIC_BASE}/|" "${i}"
  • -q参数让grep静默执行,仅返回状态码;||表示只有前面命令返回非0(即未找到前缀)时,才执行后面的Sed命令。

方案3:先清除已有前缀,再重新添加

无论文件是否被处理过,先移除已有的目标前缀,再重新添加,确保结果始终正确:

sed -i "s|img src='${BASEDIR}/${PUBLIC_BASE}/|img src='|" "${i}"
sed -i "s|img src='|img src='${BASEDIR}/${PUBLIC_BASE}/|" "${i}"
  • 第一步先把已存在的前缀去掉,第二步再统一添加,重复执行也不会出现路径重复问题。

内容的提问来源于stack exchange,提问作者Valentin Luque

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:45:32