sed - 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: `/'
。
我怎样才能达到我想要的结果?我还是个新手,所以我的错误可能会很愚蠢。如果您能提供帮助将不胜感激。
解决方案
这可能对您有用(GNU sed):
sed '/<p>/{x;/./{x;d};x;h}' file
如果当前行不包含<p>
,则正常打印。
如果当前行包含<p>
并且在保持空间中有副本,则删除当前行。
否则将当前行复制到保留空间并正常打印。
选择:
sed -z 's/.*<p>.*\n//2mg' file
推荐阅读
- mysql - 选择所有不持有任何产品的客户
- android - 主线程外的前台服务?
- java - 为什么数组的长度没有更新,导致索引越界错误?
- gremlin - 如何从顶点标签中删除属性约束
- c++ - 加法程序在意外点退出
- python - 为什么此代码中“pxssh.pxssh()”中没有指定端口?
- php - Elementor Wordpress 插件将单词“array”随机添加到我的自定义小部件中
- django - django可以集成zerorpc吗?
- python-3.x - Bokeh DataCube 小部件的 SumAggregator 如何汇总超过 1 个字段
- reactjs - 为什么我在位置 4 处得到 JSON 中的 Unexpected token F