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
相关产品推荐
相关产品推荐

