根据使用Perl从这些行提取的信息,用行替换行

时间:2018-11-04 12:20:26

标签: regex perl

我有一个包含以下几行的文件:

第一个模式:

    .comm   "8"
    ....
    .comm   "20"

第二种模式:

    .comm   _resultAvg,8,4
    .comm   _resultSwap,8,4
    .comm   _resultMax,20,4

我想将第一个模式替换为:

    .data.32 0
    .data.32 0
    ...
    .data.32 0
    .data.32 0
    .data.32 0
    .data.32 0
    .data.32 0

第二种模式为:

.data
_resultAvg:
    .data.32 0
    .data.32 0
.data
_resultSwap:
    .data.32 0
    .data.32 0
.data
_resultMax:
    .data.32 0
    .data.32 0
    .data.32 0
    .data.32 0
    .data.32 0

我可以使用来执行第一个任务

#!/usr/bin/perl
use warnings;
use strict;
use String::Interpolate;
my $j=0;

while (<>) {
    if (my ($string) = /^\s+\.comm\s+"(.*)"/) {
        for( $j=0; $j < ($string/4); $j = $j +1){
            print  "\t.data.32\t0\n";
        }
    } else {
        print;
    }
}

如何执行第二项任务?那是找到数字例如20,然后将其除以4,然后在以相关符号开头之后放入相应的#.data.32 0”行。

致谢

1 个答案:

答案 0 :(得分:2)

这是对代码的修改,以处理第二种情况:

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

while (<>) {
    if (my ($string) = /^\s*\.comm\s+(.*)/) {
        my $cnt;
        if ($string =~ /^"(\d+)"$/) {
            $cnt = $1 / 4;
        } elsif ($string =~ /^(.+),(\d+),(\d+)$/) {
            print ".data\n$1:\n";
            $cnt = $2 / $3;
        } 
        for (1 .. $cnt){
            print  "\t.data.32\t0\n";
        }
    } else {
        print;
    }
}