如何使用sed为href链接添加.html后缀并排除特定链接?
解决方案:用sed精准添加.html后缀(排除特定链接)
sed完全能搞定这个需求,只需要调整正则表达式,精准匹配需要修改的链接即可。
推荐命令(GNU sed适用)
sed -E -i 's/(href=")([^"]*)(?!:\/\/)(?!\.(css|js))"/\1\2.html"/g' "$FILE"
命令逻辑拆解
-E:启用扩展正则语法,支持负向前瞻这类高级匹配规则(href="):捕获链接的起始标签部分,替换时用\1引用([^"]*):捕获引号内的链接内容,替换时用\2引用(?!:\/\/):负向前瞻,确保链接内容里没有://(直接排除带协议的外部链接,比如https://xxx)(?!\.(css|js)):负向前瞻,确保链接内容不是以.css或.js结尾(排除已有特定后缀的资源链接)- 替换后的
\1\2.html":把捕获的起始部分、链接内容,加上.html后缀,再补回结尾引号,完成修改
兼容旧版sed的替代方案
如果你的sed版本不支持负向前瞻,可分两次执行sed命令,先排除带协议的链接,再修正误加后缀的情况:
# 第一步:给不带://的链接添加.html后缀 sed -i '/href=".*:\/\/.*"/! s/\(href="\)\([^"]*\)\("\)/\1\2.html\3/g' "$FILE" # 第二步:给误加了.html的.css/.js链接还原后缀 sed -i 's/\(href=".*\)\.html\(\.\(css\|js\)"\)/\1\2/g' "$FILE"
关于sed是否合适
sed非常适合这类场景:它是专门处理行文本替换的轻量工具,执行效率高,不需要加载庞大的解析库,完全能满足你对批量链接修改的需求。
内容的提问来源于stack exchange,提问作者tsvallender
相关产品推荐
相关产品推荐

