问题已经是discussed here ,但我注意到最受欢迎的答案实际上是错误的,并且由于该页面仍然在谷歌中排名第一,我认为对此发表评论是有意义的。原来的讨论我不能评论,因为我的声望太低了,所以如果管理员认为它应该移到那里,请这样做,不要太严厉地批评我))
所以,我们要删除所有的东西,用html注释标签表示
This is how my text (html) file looks like
<!--
| |
| This is a dummy comment |
| please delete me |
| asap |
| |
________________________________
| -->
投票最多的答案建议使用以下代码
#! /bin/sed -f
# Delete HTML comments
# i.e. everything between <!-- and -->
# by Stewart Ravenhall <stewart.ravenhall@ukonline.co.uk>
/<!--/!b
:a
/-->/!{
N
ba
}
s/<!--.*-->//
虽然它适用于简单的情况,但当另一个评论在同一行开始时,它会失败,而前一个评论在同一行结束。例如,输入
<!--
1 --><!--
2 --><!--
3
-->
应用上面的脚本后,会给出
<!--
2 --><!--
3
-->
这意味着只有第一条评论会被删除。原因是在应用替换命令后,代码不检查缓冲区是否也有下一条注释的起始标记。
解决这个问题的办法就是修改代码这样
#! /bin/sed -f
:x
/<!--/!b
:a
/-->/!{
N
ba
}
s/<!--.*-->//
bx
或者,用简短的符号表示
cat file.html | sed ':x;/<!--/!b;:a;/-->/!{N;ba};s/<!--.*-->//;bx'
我认为更正此脚本很重要,因为它列在 seder's grab bag 上
Brian Clements 提出了一个更简洁、更优雅的解决方案。 (我稍微修改了一下)
cat file.html | sed ':a;s/<!--.*-->//g;/<!--/{N;ba}'
这个工作正常,因为即使在替换完成后,代码也会检查下一条注释的开头是否存在。然而在我看来(如果我错了请纠正我)与修改后的 Stewart Ravenhall 代码相比,这个解决方案会慢一点,因为正则表达式将被搜索多次,即使它不存在,而第一个脚本仅在肯定存在时才运行对正则表达式的搜索。
最佳答案
sed -n 'H
$ {g
s/<\!--/²/g;s/-->/³/g
:a
s/²[^³]*³//g
t a
s/.//p
}' YourFile
- 假设
²
,³
不在 html 中使用(如果使用,请更改分隔符或修改代码以通过替换字符串更改任何出现,并在末尾返回) - 不要处理字符串中的 html 标签,如
" blabla <!--
- 考虑了任何嵌套级别(受使用的 sed 缓冲区/内存限制)
关于regex - 使用 sed 删除 html 注释标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25976904/