regex - 使用 sed 删除 html 注释标签

标签 regex bash sed

问题已经是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/

相关文章:

linux - 是否可以使用 shell 脚本递归地创建文件夹?

bash - 使用bash脚本更新文件内容

string - sed:如何替换包含特定字符串的所有行?

sed - 需要解析如下sed命令 : sed -e 's//\' $'\n/g'

javascript - 正则表达式 从字符串中提取模板标签 {{..}}

javascript - RegExp 通配符不应覆盖

multithreading - 编写一个 bash 脚本来重启一个守护进程

bash - Bash 中的错误处理

xml - 如何为一个节点使用两个不同的分析字符串

javascript - 使用javascript用空格替换换行符