真是个满嘴的话题。
因此,从本质上讲,我需要基于该模式在文件中找不到某些东西的模式。
例如,我拥有的是:
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"
我真的很茫然,已经为此努力了大约一天。我尝试了sed,awk,perl,并且现在正与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
该代码不会赢得选美比赛,但应该可以。您可能需要使正则表达式更加严格以避免误报,当然,您将需要其他代码来实际更新源文件。祝好运。