以找到没有特定字符串的所有行的方式调用grep?

时间:2018-01-16 16:21:34

标签: perl

我正在尝试构建一个Perl程序,其中使用grep来查找特定字符串并避免其他字符串。

找到相关字符串的解决方案很简单:

open(FILE, "<".$file) or next;
my @listOfLines = <FILE>;
close FILE;

my $strToGrep = "strToFind1|strToFind2";

my @results   = grep /$strToGrep/, @listOfLines;

但我如何避免找不到相关字符串?

我想避免:

my @subStrToAvoid = qw/ strToAvoid1 strToAvoid2 strToAvoid3 /;

有没有办法可以像使用Perl grep一样使用Perl grep 来自bash的某些标志的{{1}}实用程序?

2 个答案:

答案 0 :(得分:4)

很容易 - perl的grep函数不是一个简单的正则表达式grep,它可以在默认情况下做各种魔术。您可以使用几乎任何返回true / false结果的代码块,并且&#39; feed&#39;它与$_。默认情况下,regex会对$_起作用,因此您可以非常轻松地拥有多个正则表达式条件。

所以你可以:

#turn your 'avoid' list into a regex
my $avoid = join ( "|", map { quotemeta } @subStrToAvoid );
#note - quotemeta is here in case @subStrToAvoid includes 
#regex meta characters like "|" or "."
   $avoid = qr/($avoid)/;
#match your regex but exclude the avoid regex
my @results = grep { m/$strToGrep/ and not m/$avoid/ } @listOfLines; 

答案 1 :(得分:0)

grep的第一个参数是一个条件,可以像使用!的任何其他条件一样被否定:

my $ignore = join "|", qw/ strToAvoid1 strToAvoid2 strToAvoid3 /;
my @result = grep !/$ignore/, @listOfLines;

如果需要,您可以链接greps:

my @out = grep /$ok/, grep !/$notOk/, @list;