Xpoint
   [напомнить пароль]

Замена подстроки результатом из предыдущей строки

Метки: [без меток]
2005-04-28 15:28:49 [обр] Mikl[досье]

Есть лог файл вида;

10.77.0.61 [213.180.216.45] - - [27/Apr/2005:09:50:56 +0400] "GET /hot_z.shtml HTTP/1.1"...
10.77.0.61 [213.171.61.130] - - [27/Apr/2005:11:12:12 +0400] "GET /select_hot_z.shtml HTTP/1.1"...
10.77.0.61 [-] - - [27/Apr/2005:11:12:27 +0400] "GET /images/pic1_1.gif HTTP/1.1"...
10.77.0.61 [-] - - [27/Apr/2005:11:12:27 +0400] "GET /images/pic4_1.gif HTTP/1.1"...
10.77.0.61 [10.0.0.77, 217.23.131.106] - - [27/Apr/2005:09:53:33 +0400] "GET / HTTP/1.1"...
10.77.0.61 [10.26.10.100, unknown, 212.74.231.225] - - [27/Apr/2005:13:39:26 +0400] "GET /th_hot_z.shtml HTTP/1.1"...
10.77.0.61 [-] - - [27/Apr/2005:13:43:30 +0400] "GET /price/index.shtml?no=117 HTTP/1.1"...

нужно привести к виду;

213.180.216.45 - - [27/Apr/2005:09:50:56 +0400] "GET /hot_z.shtml HTTP/1.1"...
213.171.61.130 - - [27/Apr/2005:11:12:12 +0400] "GET /select_hot_z.shtml HTTP/1.1"...
213.171.61.130 - - [27/Apr/2005:11:12:27 +0400] "GET /images/pic1_1.gif HTTP/1.1"...
213.171.61.130 - - [27/Apr/2005:11:12:27 +0400] "GET /images/pic4_1.gif HTTP/1.1"...
217.23.131.106 - - [27/Apr/2005:09:53:33 +0400] "GET / HTTP/1.1"...
212.74.231.225 - - [27/Apr/2005:13:39:26 +0400] "GET /th_hot_z.shtml HTTP/1.1"...
212.74.231.225 - - [27/Apr/2005:13:43:30 +0400] "GET /price/index.shtml?no=117 HTTP/1.1"...

делаю следующее

while(<OLD>)
 {
   s|^\S+\s+||;
   s|\[(\S+)](\s+-)|$1$2|;
   s|\[(\S+\s+)+(\S+)](\s+-)|$2$3|;

   print NEW $_ or die "can't write $new: $!";

 }

Подскажите пожалуйста, как заменить подстроку [-] подстрокой из предыдущей строки.

спустя 19 минут [обр] Алексей Севрюков(45/1292)[досье]

Хм...

s|(old)||;
my $str=$1;
s|$str|new|;

?

спустя 5 часов [обр] Дмитрий Кучкин(3/236)[досье]
$prev='unknown';
while (<OLD>) {
  s|^[^\[]+\[||;
  s|^(?:[^, \]]+, +)*([^, \]]+)\]|$1|;
  if ($1 eq '-') {s|^-|$prev|}
  else {$prev=$1}
  print NEW or die;
}
спустя 12 часов [обр] Mikl[досье]

Спасибо всем.
разобрался сам и получилось следующее.
$prev='unknown';
 while(<OLD>)
 {
   s|^\S+\s+||;
   if(m|^\[-]| && $prev ne "") {s|^\[-]|$url|}
   if(m|^\[(\S+)]|) {
   s|^\[(\S+)](\s+-)|$1$2|;
        $prev=$1;
   }
   if(m|^\[(\S+\s+)+(\S+)](\s+-)|)
   {
   s|\[(\S+\s+)+(\S+)](\s+-)|$2$3|;
        $prev=$2;
   }
   print NEW $_ or die;

Дмитрий, спасибо, Ваш вариант красивее.

Powered by POEM™ Engine Copyright © 2002-2005