使用sed转换html标记

时间:2012-12-28 09:42:28

标签: regex linux replace sed

我有一个如下标签:

<div style="position:absolute;opacity:0.5" class="header">Home</div>

(可能有也可能没有样式或其他属性)并且使用sed我需要将其转换为span的id是div的类的范围:

<span style="position:absolute;opacity:0.5" id="header">Home</span>

我知道如何在PHP中执行此操作但不幸的是我的Linux缺乏:) 找到符合条件的DIV的正则表达式是:

#<div .* id=(.*)>.*</div>#

但我不知道如何编写替换部分,主要是因为我需要保留div标签名称和id之间的内容。现在是凌晨4点45分,这也可能与它有关:p。

我很感激您的帮助,谢谢。

2 个答案:

答案 0 :(得分:2)

使用sed,如果您想要更具体的处理:

sed '/<div/{s/<div /<span /;s/ class *=/ id =/;s!</div!</span!}' input

但是,假设start和close标签位于同一行,并且该行上有一个div标签。此外,它假定class属性是该行上唯一的属性。

更严格的命令是:

sed 's!<div\([^>]*\) class *= *\([^>]*\)>\([^<]*\)</div>!<span\1 id=\2>\3</span>!g' input

答案 1 :(得分:0)

sed 's/div/span/;s/id/class/' foo.html

将输出

<span style="position:absolute;opacity:0.5" class="header">Home</div>

foo.html是您的文件

请注意

这将仅取代divid的第一次出现。如果要替换all,则必须在每个替换模式的末尾添加“g”char,例如s/div/span/g

而且,同样重要的是,如果你想覆盖你的文件(所以如果你想要“替换”),你必须按照以下方式进行处理sed -ie 's/div/span/;s/id/class/' foo.html

最后一件事:正如Basile Starynkevitch在评论中所说,也许sed不是最佳选择