grep? no.
имеется много файлов, находимых по паттерну, в которых нужно найти строки, содержащие подстроку А и расположенные между строками, содержащими подстроки B и С. ответ должен обязательно содержать file name + line number, копия строки тоже желательна. какой тул поможет мне это сделать с минимальным геморроем?
no subject
ну вот давай, если интересно, посмотрим, сколько итераций потребуется для доведения твоего кода до полного удовлетворения user requirements.
во-первых, "расположенные между" вовсе не значит "next to each other". если B расположена на строке №1, А - на строке №3, а С - на строке №5, то это тоже должно быть found.
во-вторых, если все три подстроки расположены в одной строке в нужном порядке, то это тоже должно быть found.
no subject
а тут у нас типа борьба трёх концепций развернулась: обойтись утилитами типа grep | xargs awk, написать на скриптовом языке типа перл, написать на нормальном языке.
no subject
no subject
no subject
no subject
no subject
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
no subject
no subject
no subject
find -name pattern |
xargs awk '/B/,/C/ { if ($0 ~ /A/) printf "%s(%d): %s\n",FILENAME,NR,$0; }'
no subject
зы. а под sed слабо скрипт модифицировать? а то я sed уже поставил, а авк ещё нет :-)
no subject
Гы-гы, каких только в природе не бывает find
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.
Re: Гы-гы, каких только в природе не бывает find
Re: Гы-гы, каких только в природе не бывает find
no subject
LENAME,NR,$0; }"
gawk: cmd. line:2: fatal: cannot open file `{' for reading (No such file or directory)
если внешние кавычки сделать одинарными, как ты написал, то он на них ругается, говорит, что illegal character.
no subject
no subject
Что до кавычек, то да, cmd не понимает апострофов (уроды). Можно написать и просто кавычки, но тогда могут быть осложнения с кавычками внутри. Надеюсь, ты их там сам победишь :)
no subject
кавычки я тоже победил (см. "с '< filename' всё работает")
спасибо anyway!
no subject
Ну я бы сделал чего-то типа этого
#!/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
и эта... если 'С' вообще в файле нет, оно же не должно выводить ничего? а вроде будет... или нет?
no subject
замечание верное, конечно. Думаешь я этот скрипт вообще запускал? ;-)
Пусть будет так
#!/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
no subject
Если A то добавится в $msg, а если C - то $msg напечатается и очистится
Re:
да, я уже сообразил (после того, как убедился, что оно работает). ну заверши же теперь неоценимую помощь, скажи, как его для всех нужных мне файлов вызвать.
no subject
как теперь его напустить на все файлы, удовлетворяющие маске, включая подкаталоги?
no subject
#!/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); }