对于类似于以下数据集的数据集:
<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模块之一,但这似乎并不必需。