【问题标题】:Perl replace string contents within quotesPerl 替换引号内的字符串内容
【发布时间】:2019-10-31 10:32:07
【问题描述】:

我有一个大的 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"/>

【问题讨论】:

  • $recordLine =~ s/role_name=".*?"/role_name=""/g;
  • @Andrey 谢谢你,这正是我想要的。一个正则表达式。请将其添加为答案,我会接受。

标签: regex perl


【解决方案1】:

使用可识别 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 ;

【讨论】:

    【解决方案2】:

    这应该可以满足您的需要:

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

    【讨论】:

      猜你喜欢
      • 2022-11-17
      • 1970-01-01
      • 2020-01-24
      • 2018-01-06
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 2020-12-22
      相关资源
      最近更新 更多