如何编写Bash脚本为HTML文件中无FQDN的CSS引用补全域名?
Bash脚本补全HTML中CSS引用的完整域名
我刚好做过类似的需求,用sed就能快速实现这个功能——它是Bash环境下处理文本替换的利器。下面是完整的解决方案,包含各种边界情况的处理:
核心脚本实现
这个脚本会自动识别HTML中不带完整域名的CSS引用(不管是相对路径还是根路径),补全你指定的FQDN,同时跳过已经带有http://或https://的外部引用,还会自动备份原文件防止误操作:
#!/bin/bash # === 配置区:请根据你的需求修改 === TARGET_HTML="index.html" # 要处理的HTML文件路径 FQDN="http://my.domain" # 你的完整域名,比如http://example.com # ================================ # 预处理FQDN:自动移除结尾的斜杠(避免拼接时出现双斜杠) FQDN=$(echo "$FQDN" | sed 's/\/$//') # 执行替换操作 sed -i.bak -E "s/href=(\"|')((?!https?:\/\/)(\/)?([^\"']*\.css))\1/href=\1$FQDN\/\4\1/g" "$TARGET_HTML" echo "✅ 替换完成!原文件已备份为 ${TARGET_HTML}.bak"
脚本细节解释
让我拆解一下关键部分,方便你理解和修改:
-i.bak:直接修改目标文件,同时生成.bak后缀的备份文件,万一替换出错可以快速恢复-E:启用扩展正则表达式,支持更复杂的匹配规则- 正则匹配逻辑:
href=(\"|'):同时匹配用双引号或单引号包裹的href属性(覆盖HTML里的两种常见写法)(?!https?:\/\/):负向前瞻,确保我们只处理没有完整域名的引用(自动跳过外部CSS资源)(\/)?([^\"']*\.css):捕获路径部分,自动忽略开头的斜杠(避免拼接后出现http://my.domain//css/style.css这种不规范的双斜杠)- 替换后的
href=\1$FQDN\/\4\1:把捕获的路径拼接到FQDN后面,保持原有的引号格式
测试示例
假设你的原始HTML有这些CSS引用:
<link rel="stylesheet" href="css/style.css"> <link rel="stylesheet" href="./css/reset.css"> <link rel="stylesheet" href="../fonts/font.css"> <link rel="stylesheet" href="/assets/main.css"> <link rel="stylesheet" href="http://external.domain/css/global.css"> <!-- 这个不会被修改 --> <link rel="stylesheet" href='css/theme.css'> <!-- 单引号的情况 -->
运行脚本后,会变成:
<link rel="stylesheet" href="http://my.domain/css/style.css"> <link rel="stylesheet" href="http://my.domain/css/reset.css"> <link rel="stylesheet" href="http://my.domain/fonts/font.css"> <link rel="stylesheet" href="http://my.domain/assets/main.css"> <link rel="stylesheet" href="http://external.domain/css/global.css"> <link rel="stylesheet" href='http://my.domain/css/theme.css'>
额外提示
- 如果需要处理
src属性加载的CSS(虽然这种情况很少见),只需要把正则里的href改成(href|src)即可 - 如果你想先预览替换效果再修改文件,可以去掉
-i.bak参数,直接在终端输出结果:sed -E "s/href=(\"|')((?!https?:\/\/)(\/)?([^\"']*\.css))\1/href=\1$FQDN\/\4\1/g" "$TARGET_HTML"
内容的提问来源于stack exchange,提问作者Total Lose
相关产品推荐
相关产品推荐

