Как использовать zcat с регулярным выражением в Perl? - PullRequest
0 голосов
/ 22 марта 2012

Я сжал .gz файлы, которые я хочу открыть, используя:

./open.pl file.gz

По сути, моя цель - распечатать только те строки в zip-файле, которые соответствуют моему регулярному выражению ... Файлы большие, поэтому я просто хочу сейчас вывести их на стандартный вывод ... Как бы я это сделал? Я думал что-то вроде:

while(<>){
  zcat $_ | <my regex> ????
}

Также я не уверен в синтаксисе для вывода строк, которые соответствуют регулярному выражению.

Ответы [ 2 ]

3 голосов
/ 22 марта 2012

Вот как я сделал подобное

open( $handle, "zcat $ARGV[0]|" ) or die("Can't open $ARGV[0]: $!");
while( <$handle> ) {
if( /regex_pattern/ ) {
   print $_;
   }
}
1 голос
/ 22 марта 2012

Я сомневаюсь, что zcat будет работать правильно на разделенных новой строкой фрагментах сжатого потока.Вместо этого вы захотите распаковать поток во время его чтения.Есть, по крайней мере, несколько способов сделать это:

foreach my $argv (@ARGV) {
    open my $gz, "zcat $argv |";
    while (<$gz>) {
        # now $_ is an uncompressed line from the file $argv
        print if /my pattern/;
    }
}

Возможно, есть решение, использующее слой :gz IO, но я не могу сейчас сделать это правильно.

...