我在日志中有一组字符串。 我想匹配一行中的特定单词,并希望删除它上面和下面的字符串。
- >首先,我想匹配" 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]}
答案 0 :(得分:2)
您的问题描述非常不清楚,但如果此解决方案正确,那么我认为它比基于正则表达式的替换要简单得多。它将$/
设置为空字符串以启用段落输入模式,并打印每个段落,除非它包含sgd
或current_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
。请参阅演示。