sed multiline删除模式

Bas*_*stl 8 bash sed

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

  {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}
Run Code Online (Sandbox Code Playgroud)

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

所以删除ID:222只会保留:

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


  {START-TAG
  foo bar 2
  ID: 333
  foo bar 3
  END-TAG}
Run Code Online (Sandbox Code Playgroud)

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

我假设一个非常简单的多行sed正则表达式脚本会这样做.有人可以帮忙吗?

它与问题非常相似:sed multiline replace,但不一样.

and*_*lrc 12

您可以使用以下内容:

sed '/{START-TAG/{:a;N;/END-TAG}/!ba};/ID: 222/d' data.txt
Run Code Online (Sandbox Code Playgroud)

分解:

/{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. 
Run Code Online (Sandbox Code Playgroud)

  • 用以下内容替换最后一行:`/ ID:\(a\| b\| c \)/ d`.其中`a`,`b`和`c`是您要删除的ID. (2认同)