Perl заменяет содержимое строки в кавычках - PullRequest
0 голосов
/ 17 июня 2019

У меня есть большой xml-файл, который я читаю построчно.

<Role elemId="id35" island_id="0" role_name="Design" value="True"/>
<Role elemId="id34" island_id="0" role_name="Lead" value="False"/>

Что мне нужно сделать, это всякий раз, когда я вижу в строке имя_ роли, мне нужно сделать его пустым.

Например, это мой желаемый вывод.Обратите внимание, что имя-роли не указано.

<Role elemId="id35" island_id="0" role_name="" value="True"/>
<Role elemId="id34" island_id="0" role_name="" value="False"/>

имя-роли может иметь любое число или комбинацию значений.поэтому я не могу жестко закодировать его

Вот мой рабочий код:

#!/usr/bin/perl

use strict;
use warnings;

print "\nPerl Starting ... \n\n"; 

while (my $recordLine =<DATA>) 
{
    chomp($recordLine);

    print "$recordLine ...\n";

    if (index($recordLine, "role_name") != -1) 
    {
        #Found role_name tag ... now blank it ... how?
        $recordLine =~ s/role_name="Design"/role_name=""/g; #I need a generic reg experssion here
        print "recordLine: $recordLine ...\n";

    }
}

print "\nPerl End ... \n\n"; 

__DATA__
<Role elemId="id35" island_id="0" role_name="Design" value="True"/>
<Role elemId="id34" island_id="0" role_name="Lead" value="False"/>

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Используйте XML-осведомленный инструмент для обработки XML.Обработка его построчно может привести к повреждению некорректно сформированного XML.

В Perl вы можете использовать XML :: LibXML .

#!/usr/bin/perl
use warnings;
use strict;

use XML::LibXML;

my $dom = 'XML::LibXML'->load_xml(IO => *DATA);

for my $role ($dom->findnodes('//Role[@role_name]')) {
    $role->{role_name} = "";
}

print $dom;

__DATA__
<Root>
<Role elemId="id35" island_id="0" role_name="Design" value="True"/>
<Role elemId="id34" island_id="0" role_name="Lead" value="False"/>
<!--
<Role elemId="id34" island_id="0" role_name="Lead" value="False"/>
-->
</Root>

Там также xsh , обертка вокруг XML :: LibXML, которую я случайно поддержу.Он интерактивен и менее многословен:

open file.xml ;
for //@role_name set . "" ;
save :b ;
0 голосов
/ 17 июня 2019

Это должно сделать то, что вам нужно:

$recordLine =~ s/role_name=".*?"/role_name=""/g;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...