PERL;匹配文件中的字符串;替换为评论

时间:2015-02-26 15:17:37

标签: regex xml perl

文件内容示例

cat File.txt
RHO_BID_RT
RHO_ASK_RT

XML文件内容

    <field name="RHO_BID_RT" type="float" id="0x01D3" sequence="1"/>
    <field name="RHO_ASK_RT" type="float" id="0x01D4" sequence="1"/>

PERL CODE

perl -pe 'BEGIN { $re = join "|", map { chomp; quotemeta } `cat File.txt` }       s/<[^>]+  "field name="($re)"[^>]+>/<!! REMOVED $1 -->/g' fields.xml

不确定为什么我没有得到预期的结果

<!-- Removed RHO_BID_RT-->
<!-- Removed RHO_ASK_RT-->

2 个答案:

答案 0 :(得分:4)

如果您对使用XML::Twig解析XML的Perl程序感兴趣,并使用具有任何给定名称的所有field元素替换注释,那么这符合该法案。< / p>

use strict;
use warnings;

use XML::Twig;
use List::Util 'any';

my @names = do {
  local @ARGV = 'File.txt';
  map { chomp; $_; } <>;
};

my $twig = XML::Twig->new( pretty_print => 'indented', );
$twig->parsefile('fields.xml');

for my $field ( $twig->get_xpath('field') ) {
  my $name = $field->att('name');
  if ( any { $name eq $_ } @names ) {
    my $comment = XML::Twig::Elt->new('#COMMENT' => " Removed $name ");
    $comment->paste(after => $field);
    $field->cut;
  }
}

$twig->print;

File.txt如您所述并且fields.xml包含此

<root>
  <field name="RHO_AAA_RT" type="float" id="0x01D1" sequence="1"/>
  <field name="RHO_BID_RT" type="float" id="0x01D2" sequence="1"/>
  <field name="RHO_ASK_RT" type="float" id="0x01D3" sequence="1"/>
  <field name="RHO_ZZZ_RT" type="float" id="0x01D4" sequence="1"/>
</root>

产生此输出

<root>
  <field id="0x01D1" name="RHO_AAA_RT" sequence="1" type="float"/>
  <!-- Removed RHO_BID_RT -->
  <!-- Removed RHO_ASK_RT -->
  <field id="0x01D4" name="RHO_ZZZ_RT" sequence="1" type="float"/>
</root>

答案 1 :(得分:2)

field name之前有一个双引号,而xml中没有。此外,您在字段名称前面有空格,并使用+量词,这至少需要一个不是>的字符。

修改上述内容后,下面的单行内容按预期工作。请注意,这是Windows,因此我已经“翻译”了某些内容。

perl -pwe"BEGIN { $re = join '|', map { chomp; quotemeta } qx(type file.txt); } s/<[^>]*field name=\x22($re)\x22[^>]+>/<!! REMOVED $1 -->/g" fields.xml
<!! REMOVED RHO_BID_RT -->
<!! REMOVED RHO_ASK_RT -->