perl搜索子字符串并注释掉所有出现的内容

时间:2013-11-18 21:42:56

标签: perl search replace append

我真的是Perl的新手,但是我必须编写一个perl脚本来搜索文件中的字符串并注释掉一些行。文件中的文本结构类似于下面的行。我必须搜索一些关键字符串,例如“1,0.75,0.31,0”

这就是我想做的......

以下内容

start_pos {
string-to-search <1, 0.75, 0.31, 0> #FOUND HERE
}
do {
   a 0.1
   d 0.6
   s 0.325
   r 0.029
   }


start_pos {
other-string<1, 0.71, 0.32, 0>
    }
   do {
   a 0.1
   d 0.6
   s 0.325
   r 0.029
   }

start_pos {
string-to-search <**1, 0.75, 0.31, 0**> #FOUND HERE
}
do {
    a 0.1
    d 0.6
   s 0.325
   r 0.029
   }

这个输出应该是

//     start_pos {
//     string-to-search <1, 0.75, 0.31, 0> #FOUND HERE !!!
//     }
//     do {
//        a 0.1
//        d 0.6
//        s 0.325
//        r 0.029
//        }


start_pos {
other-string<1, 0.71, 0.32, 0>
    }
   do {
   a 0.1
   d 0.6
   s 0.325
   r 0.029
   }

//     start_pos {
 //    string-to-search <**1, 0.75, 0.31, 0**> #FOUND HERE !!!
//     }
//     do {
//         a 0.1
//         d 0.6
//        s 0.325
//        r 0.029
//      }

我找到子字符串没有问题,但我不知道如何评论从“start_pos”到“}”的行。

请帮忙

提前致谢

1 个答案:

答案 0 :(得分:1)

如果您总是拥有属于一个条目的相同行数,只要看到start_pos,就可以拾取数组中的九行。

然后你可以搜索你的字符串。如果则按原样打印行。如果 ,则所有行都会使用注释^替换行//的开头,然后打印行

my @entry;

# pickup the lines
# and search for the string

if (found) {
    foreach my $line (@entry) {
        $line =~ s!^!// !;
    }
}

foreach my $line (@entry) {
    print "$line";
}

更新

完整示例

use warnings;
use strict;

my @entry;
my $collecting = 0;
my $found = 0;

while (<>) {
    if (m/start_pos/) {
        # begin collecting lines
        $collecting = 1;
    }

    if ($collecting) {
        # test for pattern
        if (m/1, 0\.75, 0\.31, 0/) {
            $found = 1;
        }

        # pickup line
        push @entry, $_;
    } else {
        # if not inside a block, just print the line
        print $_;
    }

    # if 9 lines collected
    if ($#entry == 8) {
        if ($found) {
            # prefix with comments
            foreach my $line (@entry) {
                $line =~ s!^!// !;
            }
        }

        # print the block
        foreach my $line (@entry) {
            print "$line";
        }

        # reset variables for next block
        @entry = ();
        $collecting = $found = 0;
    }
}