我真的是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”到“}”的行。
请帮忙
提前致谢
答案 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;
}
}