首页 > 解决方案 > sed:跳过第一次出现的匹配,然后对于所有其他出现,删除包含匹配的整行

问题描述

我想实现这一点:

例如,如果我有这个文本:

<div>
    <p>First text</p>
</div>
<div>
    <p>Second text</p>
    <p>Third text</p>
</div>

我正在匹配<p>

我希望输出为:

<div>
    <p>First text</p>
</div>
<div>
</div>

我试过sed '0,/<p>/! /<p>/d'了,但它输出unknown command: `/'

我怎样才能达到我想要的结果?我还是个新手,所以我的错误可能会很愚蠢。如果您能提供帮助将不胜感激。

标签: sedgnu

解决方案


这可能对您有用(GNU sed):

sed '/<p>/{x;/./{x;d};x;h}' file

如果当前行不包含<p>,则正常打印。

如果当前行包含<p>并且在保持空间中有副本,则删除当前行。

否则将当前行复制到保留空间并正常打印。


选择:

sed -z 's/.*<p>.*\n//2mg' file

推荐阅读