使用Perl基于字符串搜索删除节?

时间:2019-03-18 20:41:44

标签: regex string perl search pos

对于类似于以下内容的数据集:

<label, someoption=true>
<variable1>
<variable2>
</label>
<label, someoption=false>
<variable1>
</label>
<label, someoption=true>
<variable1>
<variable2>
<variable3>
</label>
<label, someoption=false>
<variable1>
<variable2>
<variable3>
</label>

出现哪个变量(上面的1、2、3)不一致。我希望它摆脱发现的部分:

someoption=true

返回:

<label, someoption=false>
<variable1>
</label>
<label, someoption=false>
<variable1>
<variable2>
<variable3>
</label>

请让我知道其他详细信息是否有帮助。预先感谢。

3 个答案:

答案 0 :(得分:3)

如果文件可以装入内存,则可以尝试使用命令行Perl

perl -0777 -ne ' while( /(<label.+?<\/label>)/gs ) 
   { $x=$1; print "$x\n" if $x!~/someoption\s*=\s*true/ } ' file

使用您指定的输入

$ cat metaditch.xml
<label, someoption=true>
<variable1>
<variable2>
</label>
<label, someoption=false>
<variable1>
</label>
<label, someoption=true>
<variable1>
<variable2>
<variable3>
</label>
<label, someoption=false>
<variable1>
<variable2>
<variable3>
</label>
$ perl -0777 -ne ' while( /(<label.+?<\/label>)/gs ) 
       { $x=$1; print "$x\n" if $x!~/someoption\s*=\s*true/ } ' metaditch.xml
<label, someoption=false>
<variable1>
</label>
<label, someoption=false>
<variable1>
<variable2>
<variable3>
</label>
$

答案 1 :(得分:2)

这将为您展示您从标准输入中读取的输出:

#!/usr/bin/env perl
use strict;
use warnings;

my $start=0;
my $label="label";  #Set the label text here
my $options="someoption"; #Set the option text here
my $value="false";  #Set the option value here
while (<>) {
    if ( /\Q$label, $options=$value/) {
        $start=1;
        print $_;
        next;
    }
    if ($start == 1) {
        print $_;
    }
    if (/\/$label/) {
        $start=0;
    }
}

答案 2 :(得分:0)

循环输入,一次一行。如果当前行与<label, someoption=true>相匹配,请跳过该行,并跳过直到包含</label>的下一行为止的每一行。否则,请打印它以及每行直到包含</label>的下一行,包括下一行。或者,您可能会幻想并使用许多XML处理Perl模块之一,但这似乎不是必需的。