1

行にバインドされていない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のように置き換える必要があります。

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 に答える