真是个满嘴的话题。

因此,从本质上讲,我需要基于该模式在文件中找不到某些东西的模式。

例如,我拥有的是:

Huge amounts of preceding code...

someHeader
                {
                        someInfo = "blah blah blah";
                }

Huge amounts of ending code...


我需要做的是使它看起来像这样:

someHeader
                {
                        someDescription = "Excellent information found here!";
                        someInfo = "blah blah blah";
                }

Huge amounts of ending code...


最重要的是:我需要找到没有“ someDescription”的“ someHeader”块的所有实例并将其插入。 “ someInfo”也不会一直存在,所以我真的需要找到每个"someheader\r\t\t{\r\t\t\t!someDescription"实例并将其替换为"someheader\r\t\t{\r\t\t\tsomeDescription = "Excellent information found here!";\r"

我真的很茫然,已经为此努力了大约一天。我尝试了sedawkperl,并且现在正与c#闲逛。

最佳答案

考虑一下算法:


逐行读取文件
如果该行匹配“ someHeader”:


创建一个新的缓冲区,但将当前行放入其中
继续将更多行读入缓冲区,直到该行匹配“}”为止
如果缓冲区不包含“ someDescription”,则将其插入
打印缓冲区

否则打印行


这是Perl的基本实现:

#!/usr/bin/perl -n

if (/^someHeader/) {
    $buf = $_;
    while (($line = <>) !~ /}/) {
        $buf .= $line;
    }
    $buf .= $line;
    if ($buf !~ /someDescr/) {
        $buf =~ s/{/{\n    someDescription = "Excellent";/;
    }
    print $buf;
} else {
    print;
}


用作:

perl parser.pl < sample.cc


该代码不会赢得选美比赛,但应该可以。您可能需要使正则表达式更加严格以避免误报,当然,您将需要其他代码来实际更新源文件。祝好运。

09-13 14:31