bash - sed 多行删除模式

标签 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}

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

所以要删除 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}

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

我假设一个非常简单的多行 sed 正则表达式脚本就可以做到。谁能帮忙?

这与问题非常相似:sed multiline replace但不一样。

最佳答案

您可以使用以下内容:

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. 

关于bash - sed 多行删除模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37680636/

相关文章:

linux - HAL - UDISKS,人类可读,在 bash 脚本中将字节转换为千兆字节

bash - 计算有多少文件在最后一行包含一个字符串

java执行linux命令

arrays - 使用 linux/bash 计算列元素的数量

Python 或 awk/sed 用于清理数据

linux - 加入一对具有特定起点的线

regex - 模式匹配并使用 sed 在文本文件中的行尾或行首添加行

bash - 在 bash 中测试一个点

linux - 如何使用 sed 替换带引号的单词和引号之间的文本?

regex - 了解 shell 中的正则表达式