имеется много файлов, находимых по паттерну, в которых нужно найти строки, содержащие подстроку А и расположенные между строками, содержащими подстроки B и С. ответ должен обязательно содержать file name + line number, копия строки тоже желательна. какой тул поможет мне это сделать с минимальным геморроем?
(no subject)
Date: 2003-06-11 12:06 pm (UTC)замечание верное, конечно. Думаешь я этот скрипт вообще запускал? ;-)
Пусть будет так
#!/usr/bin/perl use strict; for my $file (glob($ARGV[0])){ open(IN,$file) or die $!; my ($between,$line,$msg); for my $string (<IN>){ $line++; $between = 1 if ($string =~ /B/); if ($string =~ /C/){ print $msg; $msg=''; $between=0; } $msg.="$file:$line $string" if ($between && $string =~ /A/); } close(IN); }(no subject)
Date: 2003-06-11 12:50 pm (UTC)(no subject)
Date: 2003-06-11 01:49 pm (UTC)Если A то добавится в $msg, а если C - то $msg напечатается и очистится
Re:
Date: 2003-06-11 02:25 pm (UTC)да, я уже сообразил (после того, как убедился, что оно работает). ну заверши же теперь неоценимую помощь, скажи, как его для всех нужных мне файлов вызвать.
(no subject)
Date: 2003-06-11 01:54 pm (UTC)как теперь его напустить на все файлы, удовлетворяющие маске, включая подкаталоги?
(no subject)
Date: 2003-06-11 02:49 pm (UTC)#!/usr/bin/perl use strict; traverse(@ARGV); sub traverse($$){ my ($path,$pattern)=@_; for my $file (glob("$path/*")){ if (-d $file){ traverse($file,$pattern); } elsif ($file =~ /$pattern/){ process($file); } } } sub process($) { my $file = shift; open(IN,$file) or die $!; my ($between,$line,$msg); for my $string (<IN>){ $line++; $between = 1 if ($string =~ /B/); if ($string =~ /C/){ print $msg; $msg=''; $between=0; } $msg.="$file:$line $string" if ($between && $string =~ /A/); } close(IN); }