我有一个不受行绑定的XML文件。它有标签<tag1>
和</tag1>
,它们从生成它的代码中有一些已删除的变量(我现在无法纠正它)。我希望能够更改这些标签中的字符来纠正它们。角色有时很特别。
我有这个Perl单行显示标签之间的内容,但现在我希望能够在文件中替换它找到的内容。
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一样替换它们。
答案 0 :(得分: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>
答案 1 :(得分:0)
无论如何 - 代码是:
#!/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>