想要使用 sed 删除特定记录

想要使用 sed 删除特定记录

我正在尝试从输入文件中删除一些记录。

list.txt
tag1,slate1,flag1,status0,8,1
tag2,slate2,flag2,status0,2,3
tag1,slate1,flag1,status1,8,1
tag2,slate2,flag2,status1,2,3
tag1,slate1,flag1,status0,0,1
tag2,slate2,flag2,status1,2,3
tag1,slate1,flag1,status1,1,2
tag2,slate2,flag2,status1,1,2
tag1,slate1,flag1,status1,3,4

预期输出:list.txt

tag2,slate2,flag2,status0,2,3
tag2,slate2,flag2,status1,2,3
tag1,slate1,flag1,status0,0,1 -> deleted records above this and matching [tag1,slate1,flag1]
tag2,slate2,flag2,status1,2,3
tag1,slate1,flag1,status1,1,2
tag2,slate2,flag2,status1,1,2
tag1,slate1,flag1,status1,3,4

我尝试使用代码:

sed '/tag2,slate2,flag2,status0/d' list1.txt

但此删除记录 tag1,slate1,flag1,status0,0,1, tag1,slate1,flag1,status1,1,2 等。

当记录达到 'tag1,slate1,flag1,status0,0,1 时,有什么方法可以停止 sed 吗?

并且未找到“tag1,slate1,flag1,status0”,则无需删除与“tag1,slate1,flag1”匹配的任何记录

任何获得输出的建议。

答案1

您可以使用awk

awk '
NR == FNR && /tag1,slate1,flag1,status0/{last_matching=FNR}
NR != FNR && FNR<last_matching && /tag1,slate1,flag1/{next}
NR != FNR
' list.txt list.txt

awk读取文件两次。

  • 第一次运行时 ( NR == FNR) ...
    • 我们将最后一个匹配项FNR(= 文件的记录/行号)保存在变量中。
  • 第二次运行时 ( NR != FNR) ...
    • 我们将跳过所有匹配的行 (--> /tag1,slate1,flag1/{next})
    • 但仅限于last_matching(--> FNR<last_matching)。
    • 并用 打印所有剩余的行NR != FNR

答案2

使用sed流编辑器实用程序我们可以执行以下操作:

sed -ne ':top
/^tag1,slate1,flag1,status0,0,1$/!{
  /^tag1,slate1,flag1,/!p;n
  btop
}
:n;p;n;bn
' list.txt
  • 在看到目标行之前,我们会继续打印不匹配的行。
  • 一旦满足目标行,我们就会继续打印所有行,直到文件耗尽。

相关内容