如何用sed在HTML闭合body标签前插入文件内容及额外标签?
解决sed在前插入文件内容并添加自定义标签的问题
我明白你遇到的麻烦了——用sed处理时总是把内容插到</body>标签后面,而不是前面,还要给插入的内容套上居中标签对吧?这其实是sed的r命令执行顺序导致的:r命令会在匹配行处理完成之后才输出读取的文件内容,所以直接用/</body>/r自然会跑到标签后面。
下面给你两种可行的解决方案,根据你的场景选就行:
方法1:Shell命令替换(简单直观,适合内容无特殊字符的情况)
如果你的insert.html里没有&、\或者#这类特殊字符,用这个命令最省心:
sed -e "s#</body>#<center>$(cat insert.html)</center>\n&#" test.html
解释:
- 用
#作为sed替换的分隔符(避免和HTML里的/冲突) $(cat insert.html)会先把insert.html的内容读入到命令中\n&表示换行后保留原来的</body>标签(&代表匹配到的原内容)
方法2:纯sed命令(健壮性高,适合复杂内容)
如果insert.html里有特殊字符,用shell替换会出问题,那就用纯sed的hold空间来处理:
sed -e '/<\/body>/ { h s/.*/<center>/ p r insert.html s/.*/<\/center>/ p g p d }' test.html
逐行解释:
- 匹配到
</body>行时,先用h把该行内容暂存到hold空间 s/.*/<center>/把当前行替换成<center>,然后p打印出来r insert.html读取并输出insert.html的全部内容- 再把当前行替换成
</center>,p打印 g从hold空间恢复原来的</body>行,p打印d删除原匹配行,避免重复输出
这样处理后,insert.html的内容就会被<center>包裹,正好放在</body>标签的前面啦!
内容的提问来源于stack exchange,提问作者user32849
相关产品推荐
相关产品推荐

