Regex 删除匹配字符串以及匹配字符串上方和下方的行

Regex 删除匹配字符串以及匹配字符串上方和下方的行,regex,perl,Regex,Perl,我在日志中有一组字符串。 我想在一行中匹配一个特定的单词,并删除上面和下面的字符串 -->首先,我想匹配“sgd”并删除包含“sgd”的字符串 -->第二,我想匹配“当前行abc”。如果匹配,我不想打印任何“INSU bug”行 输入: start_bug current_line hdl/hjk/ ins_bug {[sgd/hsjfk/123]} start_bug current_line dsfd ins_bug {[hds/hdf/123]}

我在日志中有一组字符串。 我想在一行中匹配一个特定的单词,并删除上面和下面的字符串

-->首先,我想匹配“sgd”并删除包含“sgd”的字符串

-->第二,我想匹配“当前行abc”。如果匹配,我不想打印任何“INSU bug”行

输入:

  start_bug
  current_line  hdl/hjk/
  ins_bug {[sgd/hsjfk/123]}


  start_bug
  current_line  dsfd
  ins_bug {[hds/hdf/123]}



  start_bug
  current_line  ahd/ijk/
  ins_bug {[sgd/hsjfk/123]}

  start_bug
  current_line  abc
  ins_bug {[hk/hsjfk/123]}
  ins_bug {[hkcd/1235/465]}
  ins_bug {[hdkc/563/545]}

  start_bug
  current_line  hjkd
  ins_bug {[hds/hdf/123]}
  ins_bug {[dfv/1235/465]}
  ins_bug {[dsf/dfdg/dfdfd]}

  start_bug
  current_line  abc
  ins_bug {[dgds/hsgds/412]}
输出

  start_bug
  current_line  hdl/hjk/

  start_bug
  current_line  dsfd
  ins_bug {[hds/hdf/123]}

  start_bug
  current_line  ahd/ijk/

  start_bug
  current_line  hjkd
  ins_bug {[hds/hdf/123]}
  ins_bug {[dfv/1235/465]}
  ins_bug {[dsf/dfdg/dfdfd]} 
您可以使用此正则表达式并替换为
空字符串
。请参阅演示


您的问题描述非常不清楚,但是如果这个解决方案是正确的,那么我认为它比基于正则表达式的替换要简单得多。它将
$/
设置为空字符串以启用段落输入模式,并打印每个段落,除非它包含
sgd
当前行abc

此程序希望输入文件的路径作为命令行上的参数

use strict;
use warnings;

my $file = shift;

open my $fh, '<', $file or die qq{Unable to open "$file" for input: $!};

local $/ = '';

while ( <$fh> ) {
    print unless /sgd/ or /current_line\s+abc/;
}

你的描述很不清楚。我看不出这两条规则会导致包含
当前行ahd/ijk/
的块被丢弃。嗨,关于这个问题,我将重新编写它。这是对正则表达式的可怕滥用。任何阅读这段代码的人都需要几分钟的时间来理解这里发生的事情。我认为这是另一个很好的例子,说明仅仅因为你可以使用正则表达式,并不意味着你就应该这样做。
use strict;
use warnings;

my $file = shift;

open my $fh, '<', $file or die qq{Unable to open "$file" for input: $!};

local $/ = '';

while ( <$fh> ) {
    print unless /sgd/ or /current_line\s+abc/;
}
start_bug
current_line  dsfd
ins_bug {[hds/hdf/123]}

start_bug
current_line  hjkd
ins_bug {[hds/hdf/123]}
ins_bug {[dfv/1235/465]}
ins_bug {[dsf/dfdg/dfdfd]}