sed多行删除模式 [英] sed multiline delete with pattern

查看:255
本文介绍了sed多行删除模式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想删除模式中所有多行出现的情况

I want to delete all multiline occurences of a pattern like

  {START-TAG
  foo bar
  ID: 111
  foo bar
  END-TAG}

  {START-TAG
  foo bar
  ID: 222
  foo bar
  END-TAG}

  {START-TAG
  foo bar
  ID: 333
  foo bar
  END-TAG}

我要删除START-TAG和END-TAG之间包含特定ID的所有部分.

I want to delete all portions between START-TAG and END-TAG that contain specific IDs.

因此,要删除ID:222,只能保留以下内容:

So to delete ID: 222 only this would remain:

  {START-TAG
  foo bar 2
  ID: 111
  foo bar 3
  END-TAG}


  {START-TAG
  foo bar 2
  ID: 333
  foo bar 3
  END-TAG}

我有一个应该删除的ID黑名单.

I have a blacklist of IDs that should be removed.

我假设一个非常简单的多行sed regex脚本可以做到这一点.有人可以帮忙吗?

I assume a quite simple multiline sed regex script would do it. Can anyone help?

它与问题非常相似: sed多行替换,但不相同.

It is very similar to Question: sed multiline replace but not the same.

推荐答案

您可以使用以下内容:

sed '/{START-TAG/{:a;N;/END-TAG}/!ba};/ID: 222/d' data.txt

故障:

/{START-TAG/ { # Match '{START-TAG'
:a             # Create label a
N              # Read next line into pattern space
/END-TAG}/!    # If not matching 'END-TAG}'...
           ba  # Then goto a
}              # End /{START-TAG/ block
/ID: 222/d     # If pattern space matched 'ID: 222' then delete it. 

这篇关于sed多行删除模式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆