имеется много файлов, находимых по паттерну, в которых нужно найти строки, содержащие подстроку А и расположенные между строками, содержащими подстроки B и С. ответ должен обязательно содержать file name + line number, копия строки тоже желательна. какой тул поможет мне это сделать с минимальным геморроем?
(no subject)
Date: 2003-06-11 10:55 am (UTC)(no subject)
Date: 2003-06-11 10:56 am (UTC)ну вот давай, если интересно, посмотрим, сколько итераций потребуется для доведения твоего кода до полного удовлетворения user requirements.
во-первых, "расположенные между" вовсе не значит "next to each other". если B расположена на строке №1, А - на строке №3, а С - на строке №5, то это тоже должно быть found.
во-вторых, если все три подстроки расположены в одной строке в нужном порядке, то это тоже должно быть found.
(no subject)
Date: 2003-06-11 11:18 am (UTC)(no subject)
Date: 2003-06-11 11:22 am (UTC)find -name pattern |
xargs awk '/B/,/C/ { if ($0 ~ /A/) printf "%s(%d): %s\n",FILENAME,NR,$0; }'
(no subject)
Date: 2003-06-11 11:23 am (UTC)(no subject)
Date: 2003-06-11 11:23 am (UTC)(no subject)
Date: 2003-06-11 11:30 am (UTC)Ну я бы сделал чего-то типа этого
#!/usr/bin/perl use strict; for my $file (glob($ARGV[0])){ open(IN,$file) or die $!; my ($between,$line); for my $string (){ $line++; $between = 1 if ($string =~ /B/); $between = 0 if ($string =~ /C/); print "$file:$line $string" if ($between && $string =~ /A/); } close(IN); }но в вашей области я и не знаю чего делают в таких случаях
(no subject)
Date: 2003-06-11 11:37 am (UTC)Variantov dva - iskat' drugoj tool (neopredelenno dolgo, ya ego eti voprosy uzhe vtoroj den' vizhu :) ili napisat' samomu po-bystromu.
S chem imenno ty ne soglasen?
Znaesh' tretij variant?
(no subject)
Date: 2003-06-11 11:43 am (UTC)зы. а под sed слабо скрипт модифицировать? а то я sed уже поставил, а авк ещё нет :-)
(no subject)
Date: 2003-06-11 11:46 am (UTC)(no subject)
Date: 2003-06-11 11:56 am (UTC)и эта... если 'С' вообще в файле нет, оно же не должно выводить ничего? а вроде будет... или нет?
(no subject)
Date: 2003-06-11 11:58 am (UTC)Гы-гы, каких только в природе не бывает find
Date: 2003-06-11 12:01 pm (UTC)Searches for a text string in a file or files.
FIND [/V] [/C] [/N] [/I] "string" [[drive:][path]filename[ ...]]
/V Displays all lines NOT containing the specified string.
/C Displays only the count of lines containing the string.
/N Displays line numbers with the displayed lines.
/I Ignores the case of characters when searching for the string.
"string" Specifies the text string to find.
[drive:][path]filename
Specifies a file or files to search.
If a path is not specified, FIND searches the text typed at the prompt
or piped from another command.
(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); }Re: Гы-гы, каких только в природе не бывает find
Date: 2003-06-11 12:06 pm (UTC)(no subject)
Date: 2003-06-11 12:07 pm (UTC)(no subject)
Date: 2003-06-11 12:37 pm (UTC)LENAME,NR,$0; }"
gawk: cmd. line:2: fatal: cannot open file `{' for reading (No such file or directory)
если внешние кавычки сделать одинарными, как ты написал, то он на них ругается, говорит, что illegal character.
Re: Гы-гы, каких только в природе не бывает find
Date: 2003-06-11 12:44 pm (UTC)(no subject)
Date: 2003-06-11 12:50 pm (UTC)(no subject)
Date: 2003-06-11 01:12 pm (UTC)(no subject)
Date: 2003-06-11 01:21 pm (UTC)а тут у нас типа борьба трёх концепций развернулась: обойтись утилитами типа grep | xargs awk, написать на скриптовом языке типа перл, написать на нормальном языке.
(no subject)
Date: 2003-06-11 01:24 pm (UTC)(no subject)
Date: 2003-06-11 01:49 pm (UTC)Если A то добавится в $msg, а если C - то $msg напечатается и очистится
(no subject)
Date: 2003-06-11 01:54 pm (UTC)как теперь его напустить на все файлы, удовлетворяющие маске, включая подкаталоги?
Re:
Date: 2003-06-11 02:25 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); }(no subject)
Date: 2003-06-12 02:56 am (UTC)Что до кавычек, то да, cmd не понимает апострофов (уроды). Можно написать и просто кавычки, но тогда могут быть осложнения с кавычками внутри. Надеюсь, ты их там сам победишь :)
(no subject)
Date: 2003-06-12 05:58 am (UTC)кавычки я тоже победил (см. "с '< filename' всё работает")
спасибо anyway!