sed - 删除两个字符串之间的最短行的块

时间:2014-12-29 04:43:44

标签: regex bash awk sed

我有一个特定的问题,我想删除2个字符串之间的一行,但这些字符串也出现在要处理的文件的其他部分。

例如,我有以下文件:

<table><tr><td>
<a name="tex2html559" href="node4.html">
<img width="37" height="24" align="BOTTOM" border="0" alt="next" src="next.gif"></a> 

 </td>
<td>
<a name="tex2html555" href="node2.html">
<img width="26" height="24" align="BOTTOM" border="0" alt="up" src="up.gif"></a> 

</td>
<td>
<a name="tex2html549" href="node2.html">
<img width="63" height="24" align="BOTTOM" border="0" alt="previous" src="prev.gif"></a> 
</td>
<td>
<a name="tex2html557" href="node1.html">
<img width="65" height="24" align="BOTTOM" border="0" alt="contents" src="contents.gif"></a> 
</td>
</tr></table>
<br>
<table><tr><td><b> suivant:</b> <a name="tex2html560" href="node4.html">G&#233;n&#233;ralisation de la notion</a></td><td>

<b> monter:</b> <a name="tex2html556" href="node2.html">Les vecteurs</a>
</td><td>
<b> pr&eacute;c&eacute;dent:</b> <a name="tex2html550" href="node2.html">Les vecteurs</a>
 &nbsp; <b>  <a name="tex2html558" href="node1.html">Table des mati&#232;res</a></b>  </td>
</tr>
</table> 

<img width="629" height="54" border="0" src="img34.gif" alt="\begin{displaymath}\begin{array}[b]{lclr}
{A^{i}_{}}_{j}\,x^{i}\,y^{j}
&amp;=&amp;{A^{1}...
...}_{2}\,x^{2}\,y^{2}
&amp;(\text{sommation sur $j$}) \\
\end{array}\end{displaymath}">
</div><p></p>

<table><tr><td>
<a name="tex2html559" href="node4.html">
<img width="37" height="24" align="BOTTOM" border="0" alt="next" src="next.gif"></a>

 </td>
<td>
<a name="tex2html555" href="node2.html">
<img width="26" height="24" align="BOTTOM" border="0" alt="up" src="up.gif"></a>

</td>
<td>
<a name="tex2html549" href="node2.html">
<img width="63" height="24" align="BOTTOM" border="0" alt="previous" src="prev.gif"></a>
</td>
<td>
<a name="tex2html557" href="node1.html">
<img width="65" height="24" align="BOTTOM" border="0" alt="contents" src="contents.gif"></a>
</td>
</tr></table>
<br>
<table><tr><td><b> suivant:</b> <a name="tex2html560" href="node4.html">G&#233;n&#233;ralisation de la notion</a></td><td>
<b> monter:</b> <a name="tex2html556" href="node2.html">Les vecteurs</a>
</td><td>
<b> pr&eacute;c&eacute;dent:</b> <a name="tex2html550" href="node2.html">Les vecteurs</a>
 &nbsp; <b>  <a name="tex2html558" href="node1.html">Table des mati&#232;res</a></b>  </td>
</tr>
</table>

我想只删除块:

<img width="629" height="54" border="0" src="img34.gif" alt="\begin{displaymath}\begin{array}[b]{lclr}
{A^{i}_{}}_{j}\,x^{i}\,y^{j}
&amp;=&amp;{A^{1}...
...}_{2}\,x^{2}\,y^{2}
&amp;(\text{sommation sur $j$}) \\
\end{array}\end{displaymath}">
</div><p></p>

我试着这样做:

sed '/<img.*/, /<\/div><p><\/p>/d' 

我得到了输出:

<table><tr><td>
<a name="tex2html559" href="node4.html">

<table><tr><td>
<a name="tex2html559" href="node4.html">

似乎sed考虑了其他<img标记,并从这些标记中删除了所有标记。

如何指出要移除的上面最短的块?

ps:我有多个像这样的HTML文件(此块的大小不同),所以我希望像sedawk一样进行自动处理。

由于

2 个答案:

答案 0 :(得分:1)

我会做这样的事情:

sed -n -e '/^$/b a' -e 'H;$ b a' -e 'b' -e :a -e 'x;/<\/div><p><\/p>/!p'

修改

这部分:

-e '/^$/b a'

表示“如果该行为空,请跳至 a ”。

此:

-e 'H;$ b a'

表示“将行添加到保留空间,然后如果这是最后一行,请跳转到 a ”。

此:

-e 'b'

表示“跳到脚本的末尾(即结束,不再在此行上工作,在下一行重新开始)”。

此:

-e :a -e 'x;/<\/div><p><\/p>/!p'

表示“这里是 a 。交换模式空间和保留空间的内容(即检索我们收集的所有内容),如果它不包含<div><p></p>,则打印出来(否则 - 如果 包含<div><p></p>,则不要打印它)“。

答案 1 :(得分:0)

从你的sed命令,为什么你不能提到宽度大小。

sed '/<img width="629"/, /<\/div><p><\/p>/d'