【问题标题】:perl search substring and comment out all occurancesperl 搜索子字符串并注释掉所有出现
【发布时间】:2013-12-02 05:43:58
【问题描述】:

我对 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”到“}”的行。

请帮忙

提前致谢

【问题讨论】:

    标签: perl search replace append


    【解决方案1】:

    如果您始终有相同数量的行属于一个条目,则只要看到start_pos,您就可以在一个数组中选取九行。

    然后你可以搜索你的字符串。如果它是 not,则按原样打印这些行。如果它那里,对于所有行,将^ 行的开头替换为注释//,然后打印这些行

    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;
        }
    }
    

    【讨论】:

    • 您好奥拉夫,感谢您的回复。我总是有相同数量的行属于一个条目,并且我可以找到搜索字符串。但是我仍然有一个大问题要将所有我必须注释掉的行添加到数组中。我必须在文件中进行搜索并注释掉这些行。我可以使用 '+
    猜你喜欢
    • 2017-04-24
    • 2011-09-25
    • 2015-10-03
    • 2017-07-04
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    相关资源
    最近更新 更多