使用Perl根据字符串搜索删除部分



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

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

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

如果文件可以适合内存,则可以尝试命令行Perl

perl -0777 -ne ' while( /(<label.+?</label>)/gs ) 
   { $x=$1; print "$xn" if $x!~/someoptions*=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 "$xn" if $x!~/someoptions*=s*true/ } ' metaditch.xml
<label, someoption=false>
<variable1>
</label>
<label, someoption=false>
<variable1>
<variable2>
<variable3>
</label>
$

这将为您提供从标准输入中读取的输出:

#!/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;
    }
}

在输入上循环一次,一次一行。如果当前行与<label, someoption=true>匹配,请跳过它,并且每个阵容都与包含</label>的下一行。否则,将其打印到并包括包含</label>的下一行。或者,您可能会很喜欢并使用许多XML处理Perl模块之一,但这似乎并不必需。

最新更新