Использование Perl для удаления разделов на основе поиска строк? - PullRequest
0 голосов
/ 18 марта 2019

Для наборов данных, подобных следующим:

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

3 голосов
/ 19 марта 2019

Если файл может поместиться в память, вы можете попробовать в командной строке 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>
$
2 голосов
/ 19 марта 2019

Это даст вам вывод, который вы демонстрируете при чтении со стандартного ввода:

#!/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;
    }
}
0 голосов
/ 19 марта 2019

Цикл по входу, по одной строке за раз.Если текущая строка соответствует <label, someoption=true>, пропустите ее и каждую строку вплоть до следующей строки, которая содержит </label>.В противном случае выведите его и каждую строку вплоть до следующей строки, которая содержит </label>.Или вы могли бы придумать и использовать один из многих модулей Perl для обработки XML, но в этом нет необходимости.

...