2016-11-23 2 views
-1

Ich habe eine Datei wie folgt aussieht:Wie können Backreference-Matches für einfache mathematische Operationen verwendet werden?

~ cat dump.txt 
    <ItemSpec id="46301" Day="1" Week="244251"/> 
    <ItemSpec id="46302" Day="2" Week="244252"/> 
    <ItemSpec id="46303" Day="3" Week="244253"/> 
    <ItemSpec id="46304" Day="4" Week="244254"/> 
    <ItemSpec id="46305" Day="5" Week="244255|244256|244257|244255|244256|244257|244255|244256|244257|244255|244256|244257"/> 
    ... 

ich die Week Spaltennummer hinzufügen 100.000 nach Prozess will, genau wie:

~ <simple shell code> dump.txt 
    <ItemSpec id="46301" Day="1" Week="344251"/> 
    <ItemSpec id="46302" Day="2" Week="344252"/> 
    <ItemSpec id="46303" Day="3" Week="344253"/> 
    <ItemSpec id="46304" Day="4" Week="344254"/> 
    <ItemSpec id="46305" Day="5" Week="344255|344256|344257|344255|344256|344257|344255|344256|344257|344255|344256|344257"/> 
    ... 

Ich weiß nicht, ob es eine einfache Art und Weise zu bedienen Rückwärtsreferenz als Zahl für mathematische Operationen. Und meine hilflose versuchen wie folgt:

~ awk '{print gensub(/([0-9]{6})/,"\\1+100000","g",$0)}' dump.txt 
    <ItemSpec id="46301" Day="1" Week="244251+100000"/> 
    <ItemSpec id="46302" Day="2" Week="244252+100000"/> 
    <ItemSpec id="46303" Day="3" Week="244253+100000"/> 
    <ItemSpec id="46304" Day="4" Week="244254+100000"/> 
    <ItemSpec id="46305" Day="5" Week="244255+100000|244256+100000|244257+100000|244255+100000|244256+100000|244257+100000|244255+100000|244256+100000|244257+100000|244255+100000|244256+100000|244257+100000"/> 


    ... 

Jede Idee wäre hilfreich, danke!

Antwort

0

Mai werden Sie dies versuchen:

wie XML Das sieht
my $line = $_; my $i = 100000; 
$line=~s#\s+Week="([^"]*)"# my $weeks=$&; $weeks=~s/\b(\d+)\b/($1+$i)/ge; ($weeks);#esg; 
2

. P arsing XML as plain text is a bad idea - Reguläre Ausdrücke sind für normale Sprachen und XML nicht.

So wie XML analysieren statt:

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

use XML::Twig; 

sub increment_week { 
    my ($twig, $itemspec) = @_; 
    my @values = split /\|/, $itemspec -> att ('Week'); 
    $_ .= "+10000" for @values; 
    $itemspec -> set_att('Week', (join '|', @values)); 

} 

my $twig = XML::Twig -> new (keep_atts_order => 1, 
           pretty_print => 'indented', 
           twig_handlers => { 'ItemSpec' => \&increment_week }); 
    $twig -> parsefile ('your_file.xml'); 
    $twig -> print; 

Dies bedeutet, dass Sie das Ganze als XML verarbeiten und wird nicht durch gültige XML-Unterschiede erhalten Stolper (XML können Sie Zeilen erstrecken, Attribut Bestellung ändern usw. ohne Semantik zu ändern).

Natürlich, wenn es ist nicht gültige XML, das wird nicht funktionieren - aber so fast XML 'zu schreiben ist eine wirklich schmutzige Sache zu tun. (Fast so dreckig wie es zu "reparieren")

+0

Eigentlich ist die 'dump.txt' nur ein zufälliger Text, den ich aussuche, was ich wirklich wissen möchte, ist ein kurzes Shell Code-Snippet für regexp mathematische Operationen. Entschuldigen Sie sich für den Ausdruck ist nicht klar. Und danke für deine Antwort, es ist sehr hilfreich. – hedleyyan

+0

Deshalb wird eine repräsentative Stichprobe Ihrer Daten wichtig. – Sobrique

Verwandte Themen