0

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

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

如果其他详细信息有帮助,请告诉我。提前致谢。

4

3 回答 3

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>
$
于 2019-03-19T09:47:08.043 回答
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;
    }
}
于 2019-03-18T21:53:07.123 回答
0

循环输入,一次一行。如果当前行匹配<label, someoption=true>,则跳过它并跳过每一行,直到包含</label>. 否则,打印它和每一行直到并包括包含</label>. 或者,您可能会喜欢并使用许多 XML 处理 Perl 模块之一,但这似乎没有必要。

于 2019-03-18T21:01:50.433 回答