выборочная печать между регулярными выражениями - PullRequest
0 голосов
/ 14 октября 2011

Мне нужно перехватить CSV-часть текстового файла из REGEXP до второй пустой строки.Пример ниже:

garbage garbage
garbage garbage
garbage garbage

REGEXP

data,data,data
data,data,data

garbage garbage
garbage garbage
garbage garbage

Будем весьма благодарны за любые идеи, как это сделать в sed или perl.

Ответы [ 4 ]

3 голосов
/ 14 октября 2011
perl -00 -ne 'print, print(scalar <>), exit if /REGEXP/' file.txt
1 голос
/ 14 октября 2011
perl -ne '$on=1 if /REGEXP/; if ($on) { print; $blank++ if /^\s*$/; last if $blank == 2 }' file.csv

Будет отображаться:

    REGEXP

data,data,data
data,data,data

Если вы не хотите отображать REGEXP:

perl -ne '$on=1 and next if /REGEXP/; if ($on) { print; $blank++ if /^\s*$/; last if $blank == 2 }' file.csv
0 голосов
/ 14 октября 2011

Использование разделителя ввода записей для захвата блоков, заканчивающихся двойными символами новой строки.Это только печатает раздел данных.Если вы хотите распечатать часть REGEXP, раскомментируйте say;

$/ = "";
while (<>) {
    next unless /^REGEXP/;
    #say;  # Uncomment to print header
    chomp($_ = <>);
    say;
}
0 голосов
/ 14 октября 2011

Примерно так:

#!/usr/bin/perl

use warnings; use strict;

while (<DATA>) {
    /^REGEXP/ and last;
}

my $csv_line;

while ($csv_line = <DATA>) {
    $csv_line =~ /,/ and last;
}

while (defined($csv_line) and $csv_line =~ /\S/) {
    process_csv($csv_line);
    $csv_line = <DATA>;
}

sub process_csv {
    my ($line) = @_;
    print $line;
}


__DATA__
garbage garbage
garbage garbage
garbage garbage

REGEXP

data,data,data
data,data,data

garbage garbage
garbage garbage
garbage garbage
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...