外壳 HTML 标记删除重复项



无论如何,我需要清理HTML中不必要的斜体标签:)

这是我的代码:

text <i>text</i> <i>text text</i> text
text <i>text</i><i> text text</i> text
text<i>text </i>text text<i>text text</i> text
text <i>text</i><i></i> text text<i>text text</i> text

这是我期望的结果:

text <i>text text text</i> text
text <i>text text text</i> text
text<i>text </i>text text<i>text text</i> text
text <i>text</i> text text<i>text text</i> text
's:</i><i>::g'

这抓住了一个基本思想,即我们想要摆脱一个结束标签,后跟一个新的开始标签,但在遇到时失败;

(1( 大写标签:

将"i"替换为"[Ii]"以匹配大写的html标记;如果您希望大写保持原样,而不是替换为小写的i,请将匹配项放在(group)中,并在sed命令的输出端1

(2(标签之间的空格; 为了用单个空格替换任意数量的空格,我们在第一个空格周围使用一个可选的匹配组,该组放入输出中:

's:</i>( )?s*<i>:1:g'

空格和正斜杠字符使用反斜杠进行转义,每次替换末尾的 g 允许它在每行上多次匹配。

(3( 标签内的空格应与捕获制表符和空格的s匹配。奇怪的是,在最后>之前允许有足够的空格,但在标签中的其他地方不允许。但是,如果标签跨越多行,您就被搞砸了。在 sed 中可以匹配多行,但将其转换为对于单行来说太长的脚本。

修改所有三种情况后,脚本行变为:

sed -i 's:</[Ii]s*>( )?s*<[Ii]s*>:1:g' yourfile.html

关于 -i 的说明(就地替换(;这是 GNU sed 中的一个选项,而不是标准 sed。 OSX 有 -i,但在 -i 之后需要一个额外的''参数。如果你的 sed 不支持 -i,你需要重定向到一个新文件,然后 mv 该文件替换原来的文件:

sed 'the same command' > newfile.html
mv newfile.html yourfile.html

请参阅 SO 问题:"sed 编辑文件就位"以获取更多信息。

最新更新