Unixの検索と置換の始点を指定して増分します。

Unixの検索と置換の始点を指定して増分します。

XMLファイルで参照されている属性の番号を変更しています。このプロパティはたとえばですdata-seq="1"。以下を使用して、すべてのファイルの属性番号を再割り当てすることができました。

find $DATA_PATH/content/*.xml -exec perl -pi -e 's/data-seq="[0-9]+(?=")/qq(data-seq=").++$n/ge' {} +

これは素晴らしい作品です。しかし、私は出発点を追加したいと思います。たとえば、data-seq="125" で番号の再設定を開始し、そこから上に上がります。それは可能ですか?

以下はxmlの例です(関連プロパティと他のタグを示す小さな部分)。

<b>Reconciliation</b>
<p>As often happens, just as one is beginning to find a solution <span class="page" title="20" data-seq="34"/>to a particular problem the problem becomes less pressing or ceases to exist.</p>
<span class="page" title="21" data-seq="35"/>
<b>The Multi-Plant Enterprise</b>
<p>The MNE is...

私が望むのは、125より前のすべてを無視し、data-seq = "125"が見つかった場合は、すべてのファイルで126から番号を再開することです。これは、属性(連続する必要があります)に間隔または繰り返しがあるため、間隔または繰り返しの後にある他のすべての数字が削除される問題を解決するためです。

マークの構造的完全性などを確認する必要はなく、数字だけ増やすだけです。

ちなみに、これはUNIXテキストファイルです。

ありがとうございます。

ベストアンサー1

いくつかのXML例がなければ、これは難しいです。正規表現は実際にはXMLをうまく処理できないため、正規表現を使用しないことをお勧めします。

私はこれを行うことができます:

#!/usr/bin/env perl
use strict;
use warnings;

use XML::Twig; 

my $start_renumber = 125;

my $twig = XML::Twig -> new ( pretty_print => 'indented_a' ) -> parse ( \*DATA ); 
foreach my $test_elt ( $twig -> findnodes ( '//test[@data-seq]' ) ) {
     $test_elt -> set_att('data-seq', $start_renumber++ );
}
$twig -> print; 

__DATA__
<xml>
   <test data-seq="999" />
   <test some-other="fish" />
   <test data-seq="123125" />
</xml>

出力を次に変更します。

<xml>
  <test data-seq="125" />
  <test some-other="fish" />
  <test data-seq="126" />
</xml>

File::Findそして、それを望むすべてのファイルと組み合わせてください。

このような:

#!/usr/bin/env perl
use strict;
use warnings;

use XML::Twig;
use File::Find;

my $start_renumber = 125;

sub update_data_seq {
    my ( $twig, $element ) = @_;
    if ( $element -> att('data-seq') > 125 ) { 
        $element->set_att( 'data-seq', $start_renumber++ );
    }
}

sub process_xml {
    next unless -f;
    next unless m/\.xml/;
    my $twig = XML::Twig->new(
        pretty_print  => 'indented_a',
        twig_handlers => { '//span[@data-seq]' => \&update_data_seq }
    );
    $twig->parsefile_inplace($File::Find::name);

}

find( \&process_xml, "/path/to/search/for/xml",
    "/some/other/path/if/you/want" );

おすすめ記事