对于类似于以下内容的数据集:
<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>
请让我知道其他详细信息是否有帮助。预先感谢。
答案 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模块之一,但这似乎不是必需的。