如何用sed批量替换HTML中<pre>标签的class属性(保留特定例外)
如何用sed批量替换HTML中
标签的class属性(保留特定例外)
嘿,这个需求很明确,我给你提供两种sed解决方案,兼顾兼容性和精准性:
方案一:兼容所有版本的sed(包括BSD/macOS默认sed)
这种方法思路简单直接:先统一替换所有符合格式的<pre>标签,再把例外的command类还原回去,操作起来不容易出错,兼容性拉满:
sed -E ' s/<pre class="([^"]+)"/<pre class="language-bash" data-label="\1"/g; s/<pre class="language-bash" data-label="command"/<pre class="command"/g ' input.html > output.html
命令解释:
- 第一行:用正则捕获
<pre class="XXX">里的XXX,把整个标签替换成<pre class="language-bash" data-label="XXX">,\1就是我们捕获到的原class值 - 第二行:把被错误替换的
command类标签还原回原来的<pre class="command">,完美避开例外情况
方案二:GNU sed专属的精准替换(一步到位)
如果你的系统用的是GNU sed(比如Linux默认的sed),可以利用负向预查直接跳过command类的标签,一步完成替换:
sed -E 's/<pre class="(?!command)([^"]+)"/<pre class="language-bash" data-label="\1"/g' input.html > output.html
命令解释:
(?!command)是负向预查,它会确保<pre class="后面的内容不是command,这样就不会匹配到<pre class="command">的标签- 剩下的逻辑和方案一一致,捕获原class值并替换成目标格式
效果验证
拿你提供的示例输入测试,两种方案都会输出你想要的结果:
<p>lore ipsum<p> <pre class="language-bash" data-label=".bashrc"><code> foo bar </code></pre> <pre class="language-bash" data-label="example.txt"><code> foo bar </code></pre> <pre class="command"><code> foo bar </code></pre> <p>lore ipsum<p>
备注:内容来源于stack exchange,提问作者Chrissss
相关产品推荐
相关产品推荐

