1

我有一个不受行约束的 XML 文件。它有标签<tag1></tag1>并且有一些从生成它的代码中删除的变量(我现在无法更正)。我希望能够更改这些标签中的字符以更正它们。人物有时很特别。

我有这个 Perl one-liner 来显示标签之间的内容,但现在我希望能够在文件中替换它找到的内容。

perl -0777 -ne 'while (/(?<=perform_cnt).*?(?=\<\/perform_cnt)/s) {print $& . "\n";      s/perform_cnt.*?\<\/perform_cnt//s}' output_error.txt

这是 XML 的一个示例。注意标签之间的垃圾字符perform_cnt

<text1>120105728</text1><perform_cnt>ÈPm=</perform_cnt>
<text1>120106394</text1><perform_cnt>†AQ;4K\_Ô23{YYÔ@Nx</perform_cnt>

我需要用 0 替换这些。

4

2 回答 2

8

我喜欢XML::Twig来处理这些事情。这需要一点时间来适应,但是一旦你了解了设计(以及一点关于 DOM 处理的知识),很多事情就会变得非常容易:

use XML::Twig;

my $xml = <<'HERE';
<root>
<text1>120105728</text1><perform_cnt>ÈPm=</perform_cnt>
<text1>120106394</text1><perform_cnt>†AQ;4K\_Ô23{YYÔ@Nx</perform_cnt>
</root>
HERE

my $twig = XML::Twig->new(   
    twig_handlers => { 
        perform_cnt   => sub { 
            say "Text is " => $_->text;  # get the current text

            $_->set_text( 'Buster' );    # set the new text
            },
      },
    pretty_print => 'indented',
    );

$twig->parse( $xml );
$twig->flush; 

通过缩进漂亮的打印,我得到:

<root>
  <text1>120105728</text1>
  <perform_cnt>Buster</perform_cnt>
  <text1>120106394</text1>
  <perform_cnt>Buster</perform_cnt>
</root>
于 2012-04-17T14:43:28.093 回答
0

使用正则表达式进行 xml 解析是一种不好的做法

无论如何 -代码是:

#!/usr/bin/perl

use strict;
use warnings;

my $tag = 'perform_cnt';

open my $fh, '<file.txt' or die $!;
foreach (<$fh>) {
  s/(<$tag>)(.*?)(<\/$tag>)/$1$3/g;
  print "$_";
}
close $fh;

输出是:

<text1>120105728</text1><perform_cnt></perform_cnt>
<text1>120106394</text1><perform_cnt></perform_cnt>
于 2012-04-17T14:01:27.317 回答