2016-11-23 49 views
-1

我有一个文件看起来像:如何使用backreferrence匹配简单的数学运算?

~ 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"/> 
    ... 

我想Week列数处理后加100,000,就像:

~ <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"/> 
    ... 

我不知道是否有使用简单的方法反向引用作为数学运算的一个数字。而我的无奈尝试如下:

~ 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"/> 


    ... 

任何想法会有所帮助,谢谢!

回答

0

可能是你可以试试这个:

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

这看起来像XML。 P arsing XML as plain text is a bad idea - 正则表达式适用于常规语言,XML不适用。

所以解析为XML,而不是:

#!/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; 

这意味着你将处理整个事情为XML,并且不会被有效的XML差异得到绊倒(XML可以让你换行,改变属性排序等等而不改变语义)。

当然,如果它不是有效的XML,这是行不通的 - 但是写这样的“几乎是XML”是非常肮脏的事情。 (几乎像肮脏的regexing它'修复'它)

+0

其实'dump.txt'只是我挑选的一些随机文本,我真正想知道的是正则表达式数学运算的一些简短的shell代码片段。为表达道歉不清楚。对于你的答案而言,这很有帮助。 – hedleyyan

+0

这就是为什么您的数据的代表性样本变得重要。 – Sobrique