我正打算用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'
有人会建议如何写吗?
答案 0 :(得分:1)
您应该使用更合适的工具; HTML不是常规语言,因此shouldn't be parsed with regular expressions和sed
是基于行的工具,而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解析器。