如何在perl中使用正则表达式附加文本(递增顺序)

时间:2015-01-21 12:56:06

标签: regex perl

我有一个包含以下数据(4行和4列)的文件

1   0.126082656 0.118439349 0.129554726 

+1  0.129733599 0.128425124 0.127376228 

+1  0.136149406 0.122109378 0.134386804 

1   0.1077886   0.108754544 0.112025117

现在我需要将1:追加到col2,2:到col3 3:到col4,依此类推到最后一列,这样数据就像

1   1:0.126082656   2:0.118439349   3:0.129554726   

+1  1:0.129733599   2:0.128425124   3:0.127376228

.
.

我尝试使用以下代码,但我无法进行增量

#!/usr/bin/perl
use strict;
use warnings;
open(my $inp, "<train.train") or die $!;
my @amu = <$inp>;
close ($inp);
foreach my $line(@amu)
{
    if ($line =~ s/(\d+\.\d+)/1:$1/g)
    {
        print $line;
        print "\n";
    }
}

请纠正我以适应所需的解决方案。

4 个答案:

答案 0 :(得分:0)

您可以尝试此替换

$line =~ s/(\d+\.\d+)/\1:1/g

更新答案:

open(my $inp, "< FileName") or die $!;
my $val;
my @amu = <$inp>;
close ($inp);
foreach my $line(@amu)
{
    $val=0;
    if ($line =~ s/(\d+\.\d+)/++$val != 0 ? "$val:$1:1" : ""/eg)
    {
        print $line;
    }
}

输出

1   1:0.126082656:1 2:0.118439349:1 3:0.129554726:1 
+1  1:0.129733599:1 2:0.128425124:1 3:0.127376228:1 
+1  1:0.136149406:1 2:0.122109378:1 3:0.134386804:1 
1   1:0.1077886:1   2:0.108754544:1 3:0.112025117:1

答案 1 :(得分:0)

(?<= )(\S+)

您可以通过\1:1$1:1尝试此操作。请参阅演示。

https://regex101.com/r/tX2bH4/75

答案 2 :(得分:0)

这是一种方法:

while(<DATA>) {
    my $i = 1;
    s/(\s)(\d)/"$1" . $i++ . ":$2"/eg;
    print;
}

__DATA__
1   0.126082656 0.118439349 0.129554726 
+1  0.129733599 0.128425124 0.127376228 
+1  0.136149406 0.122109378 0.134386804 
1   0.1077886   0.108754544 0.112025117

<强>输出:

1   1:0.126082656 2:0.118439349 3:0.129554726 
+1  1:0.129733599 2:0.128425124 3:0.127376228 
+1  1:0.136149406 2:0.122109378 3:0.134386804 
1   1:0.1077886   2:0.108754544 3:0.112025117

答案 3 :(得分:0)

我可能在没有脚本但在命令行上执行此操作:

perl -pe "$q=1;s/(\s)(\S)/$1 . $q++ . ':' . $2/ge" your_file.txt