sed命令处理输入流,并用<em>标记替换所有HTML <i>标记

时间:2018-12-27 14:05:25

标签: html bash sed

我正打算用sed命令编写一个正则表达式来处理输入流,并用标记替换所有HTML标记,例如:

This is <i id="x">emphasized text</i> and <i>so is this</i>.

将替换为

This is <em id="x">emphasized text</em> and <em>so is this</em>.

我尝试了以下方法:

sed -r 's/<\/?i[^>]*> / <\/?em[^>]*>/ /g'

有人会建议如何写吗?

1 个答案:

答案 0 :(得分:1)

您应该使用更合适的工具; HTML不是常规语言,因此shouldn't be parsed with regular expressionssed是基于行的工具,而HTML中的换行符却被忽略。

如果您确定可以忽略这一点(您的HTML是最标准的,就不会有定义定义在多行中的标记,等等),请使用以下GNU sed命令可能对您有用:

sed -E 's@<(/?)i\b@<\1em@g'

我们使用-E RE正则表达式而不是默认的BRE风格,以便能够使用\b“ word-boundary”元字符,以确保i不跟在后面其他字母(不想匹配<img<input<iframe标签);对于较旧的GNU -r版本,请使用sed

通过将可选的</i捕获到我们在替换模式中引用的捕获组中,我们可以一次替换<i/。匹配<i时,由于捕获组为空,替换将为<em,而匹配</i时,替换将为</em

为了避免不得不在模式中转义@,我使用/作为搜索/替换命令的分隔符,而不是通常的/

否则,如果要解析XHTML,则应该研究HTML甚至XML解析器。