我想使用 sed 来细化 HTML 代码,作为使用 HTML Tidy 细化之后的额外细化过程,因为 HTML Tidy 对于某些要求来说看起来不够灵活。
我使用此命令向某些标签添加一些制表符和/或换行符,并从其他标签中删除它们:
s/<li>/\t&/g
s/\n<\/li>/<\/li>/g
- 除非有属性,否则第一个命令工作正常,
li
那么,无论它是否有属性,如何定位开始标签? - 第二个命令根本不起作用。我想在这里将结束标记放在
</li>
上一行的末尾。
答案1
考虑这个示例文件:
$ cat sample.html
<li a=x>Point One
</li>
<li>Point Two
</li>
我相信这个sed
命令可以满足您的要求(这可能需要 GNU sed):
$ sed -Ez 's|<li\b|\t<li|g; s|\n</li\b|</li|g' sample.html
<li a=x>Point One</li>
<li>Point Two</li>
怎么运行的
-E
使用扩展正则表达式。
-z
读取以 null 分隔的数据。由于正确的 html 文件没有空字符,因此这具有一次读取整个文件的效果。
s|<li\b|\t<li|g
这会在每次出现的前面放置一个制表符,
<li
后跟一个单词边界。s|\n</li\b|</li|g
这将替换每次出现的换行符,后跟
<li
单词边界<li
。
一种变体:<li>
单独放置一条线
$ sed -Ez 's|<li[^>]*>|&\n|g; s|\n</li\b|</li|g' sample.html
<li a=x>
Point One</li>
<li>
Point Two</li>
强制性警告
html 可能很复杂,这些sed
命令仅适用于简单的情况。