在Perl中取反正则表达式

阿特雷茹

我将文本文件拆分为多个块,以便使用正则表达式提取包含特定行的那些块文本文件如下所示:

[Term]  
id: id1  
name: name1  
xref: type1:aab  
xref: type2:cdc  

[Term]  
id: id2  
name: name2  
xref: type1:aba  
xref: type3:fee 

有人帮了我前几天向我展示了如何提取那些块含有一定的正则表达式(例如,“外部参照:3型”):

while (<MYFILE>) {
  BEGIN { $/ = q|| }
    my @lines = split /\n/;
    for my $line ( @lines ) {
        if ( $line =~ m/xref:\s*type3/ ) {
            printf NEWFILE qq|%s|, $_;
            last;
        }
    }
}

现在,我要在不包含“ xref:type3”的新文件中写入所有块。我试图通过简单地否定正则表达式来做到这一点

if ( $line !~ m/xref:\s*type3/ )

或者通过使用否定if语句

unless ( $line =~ m/xref:\s*type3/ )

不幸的是,它不起作用-输出文件与原始文件相同。有什么想法我做错了吗?

池上

你有:

对于每一行,如果该行与模式不匹配,则打印该块。

但是你想要:

对于每一行,如果块中的其他所有行均不匹配该模式,则打印此行。

因此,您无法在检查块中的每一行(或在找到匹配的行之前在所有行中)之前开始打印块。

local $/ = q||;
while (<MYFILE>) {
    my @lines = split /\n/;

    my $skip = 0;
    for my $line ( @lines ) {
        if ( $line =~ m/^xref:\s*type3/ ) {
            $skip = 1; 
            last;
        }
    }

    if (!$skip) {
        for my $line ( @lines ) {
            print NEWFILE $line;
        }
    }
}

但是没有必要分成几行。我们可以一次检查并打印整个块。

local $/ = q||;
while (<MYFILE>) {
    print NEWFILE $_ if !/^xref:\s*type3/m;
}

(请注意/m,使之^与任何行的开头匹配。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章