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

时间:2015-10-09 17:47:05

标签: regex perl

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

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

- >第二,我想匹配" current_line abc"。如果匹配,我不想打印任何" ins_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]} 

2 个答案:

答案 0 :(得分:2)

您的问题描述非常不清楚,但如果此解决方案正确,那么我认为它比基于正则表达式的替换要简单得多。它将$/设置为空字符串以启用段落输入模式,并打印每个段落,除非它包含sgdcurrent_line 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/;
}

输出

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]}

答案 1 :(得分:1)

\bstart_bug\b(?:(?!\bstart_bug\b)[\s\S])*?\bsgd\b(?:(?!\bstart_bug\b)[\s\S])*

您可以使用此正则表达式并替换为empty string。请参阅演示。

https://regex101.com/r/mG8kZ9/6