Perl替换引号内的字符串内容

时间:2019-06-17 19:45:04

标签: regex perl

我有一个很大的xml文件,正在逐行阅读。

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

我需要做的是每当在字符串中看到role_name时都需要将其空白。

例如,这是我想要的输出。注意,role_name已被清空。

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

role_name可以具有任何数字或值的组合。所以我不能硬编码

这是我的工作代码:

#!/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 个答案:

答案 0 :(得分:1)

使用支持XML的工具来处理XML。逐行处理它可能会导致格式不正确的XML损坏。

在Perl中,您可以使用XML::LibXML

if(test-path c:\temp\a.xml)
{
    $a = import-clixml -Path c:\temp\a.xml
}

$a
1

还有xsh,这是我刚维护的XML :: LibXML的包装器。它是交互式的,而且不太冗长:

d3.select(this.$el).select('#brush');
    .style('fill', '#569fd5')
    .call(brush.on('end', brushended));

答案 1 :(得分:0)

这应该可以满足您的需求

$recordLine =~ s/role_name=".*?"/role_name=""/g;