2013-03-20 112 views
0

难以获得sed搜索并替换使用html文件。sed替换html

我有一个看起来像这样多个部分:

<TABLE class="cattable"> 
    <TBODY> 
    <TR> 
     <TH colspan="2">Header</TH></TR> 
    <TR> 
     <TD>Random Amount of Data</TD> 
     <TD>3</TD></TR> 
    <TR> 
     <TD>Moar Data</TD> 
     <TD>3</TD></TR> 
    <TR> 
     <TD>Yup, More</TD> 
     <TD>4</TD></TR></TBODY></TABLE> 

我需要:与xxxxFOOxxxx

取代:

<TABLE class="cattable"> 
    <TBODY> 
    <TR> 
    <TH colspan="2"> 

保持这样的:

Header 

更换这与yyyy FOOyyyy:

</TH></TR> 

保持这样的:

<TR> 
    <TD>Random Amount of Data</TD> 
    <TD>3</TD></TR> 
<TR> 
    <TD>Moar Data</TD> 
    <TD>3</TD></TR> 
<TR> 
    <TD>Yup, More</TD> 
    <TD>4</TD></TR> 

与替换此zzzzFOOzzzz:

</TBODY></TABLE> 

继承人什么我试着在vim,但不能限制贪婪*正确:

s:\(<TABLE class="cattable">\_s\s*<TBODY>\_s\s*<TR>\_s\s*<TH colspan="2">\)\(.*\)\(<\/TH><\/TR>\)\(\_.*[^<]*\)\(<\/TABLE>\):xxxxFOOxxxx\2yyyyFOOyyyy\4zzzzFOOzzz<br>:g 

tia

+1

正则表达式不是此任务工具的好选择。另外,vim不使用标准的lazy/greedy正则表达式语法。 – jahroy 2013-03-20 17:43:17

+2

使用许多好的perl包之一来处理xml。否则,如果你坚持使用正则表达式,请参阅http://stackoverflow.com/a/1732454/1841533 ^^ – 2013-03-20 19:30:06

回答

1

*替换为\{-}以获得非贪婪匹配(与PCRE/Perl正则表达式中的*?相同)。对于更复杂的情况,你将不得不使用负面预测/后视:如\(\(<\/TH><\/TR>\)\@!.\)*代替.*,这里.\{-}可能就足够了。

注意:在sed中不起作用。

注2:vim没有使用BRE和ERE(基本/扩展正则表达式),如sed呢,vim:s没有援引任何外部的程序(包括sed)既不您尝试适合sed。因此,如果您不打算询问如何在sed中从标记中删除sed

+0

感谢这有助于。我想使用sed,因为我没有在vim运气。 vim代码仅仅是为了参考我想要做的事情。我确实看到了jahroy和Olivier所说的智慧,并且已经将蟒蛇变成了一个美丽的姑娘。 – Dan 2013-03-20 23:32:36