Как мне собрать строки между двумя ключевыми словами? - PullRequest
1 голос
/ 29 июля 2010

START

  Length: 1432

  RIdentifier: 4

  VIdentifier: 4

  Format: 5

  TS number: 9

  DHeader

    Version        = 1
    Length         = 1432
    Command Flags  = RPT (0xd0)
    Command Code   = Accounting-Request (271)
    Application Id = Rf-Application (3)
    Hop By Hop Id  = 51
    End To End Id  = 8847360

START

  Length: 12

  RIdentifier: 2

  VIdentifier: 4

  Format: 5

  TS number: 6

  DHeader

    Version        = 1
    Length         = 1432
    Command Flags  = RPT (0xd0)
    Command Code   = Accounting-Request (271)
    Application Id = Rf-Application (3)
    Hop By Hop Id  = 51
    End To End Id  = 8847360

START

Мне нужно собрать все строки, найденные между START, и записать его в 2 файла.Я попытался с флип-флоп в Perl, как:

open(FILE, $ARGV[0]);
while (<FILE>) {
    if (/START/ .. /START/) {
        print "$. $_ \n";
    }
}

Но я получаю только строки, которые имеют START.Не могли бы вы помочь мне?

Ответы [ 4 ]

1 голос
/ 29 июля 2010

...

#!/usr/bin/perl
use strict;
use warnings;

my $output;
while(<DATA>) {
  if(/START/) {
    if(defined $output) {
      print $output;
      $output = '';
      print "="x80,"\n";
    }
    next;
  } else {
    $output .= $_;
  }
}

__DATA__
START

Length: 1432

RIdentifier: 4

VIdentifier: 4

Format: 5

TS number: 9

DHeader

Version        = 1
Length         = 1432
Command Flags  = RPT (0xd0)
Command Code   = Accounting-Request (271)
Application Id = Rf-Application (3)
Hop By Hop Id  = 51
End To End Id  = 8847360

START

Length: 12

RIdentifier: 2

VIdentifier: 4

Format: 5

TS number: 6

DHeader

Version        = 1
Length         = 1432
Command Flags  = RPT (0xd0)
Command Code   = Accounting-Request (271)
Application Id = Rf-Application (3)
Hop By Hop Id  = 51
End To End Id  = 8847360

START

вывод:

Length: 1432

RIdentifier: 4

VIdentifier: 4

Format: 5

TS number: 9

DHeader

Version        = 1
Length         = 1432
Command Flags  = RPT (0xd0)
Command Code   = Accounting-Request (271)
Application Id = Rf-Application (3)
Hop By Hop Id  = 51
End To End Id  = 8847360
================================================================================

Length: 12

RIdentifier: 2

VIdentifier: 4

Format: 5

TS number: 6

DHeader

Version        = 1
Length         = 1432
Command Flags  = RPT (0xd0)
Command Code   = Accounting-Request (271)
Application Id = Rf-Application (3)
Hop By Hop Id  = 51
End To End Id  = 8847360
================================================================================
0 голосов
/ 30 июля 2010

split функция поможет вам, как

    #!/usr/bin/perl
    use strict;
    use warning;
    open(IN, '<', $ARGV[0]) or die $!;
    read(IN, my $data, -s $ARGV[0]);
    my @test = split(/START/, $data);
    shift(@test); #removing first element of array
    foreach my $test(@test){
     print"Records:$test\n";
    }

OUTPUT

Records:
    Length: 1432

      RIdentifier: 4

      VIdentifier: 4

      Format: 5

      TS number: 9

      DHeader

        Version        = 1
        Length         = 1432
        Command Flags  = RPT (0xd0)
        Command Code   = Accounting-Request (271)
        Application Id = Rf-Application (3)
        Hop By Hop Id  = 51
        End To End Id  = 8847360


Records:
    Length: 12

      RIdentifier: 2

      VIdentifier: 4

      Format: 5

      TS number: 6

      DHeader

        Version        = 1
        Length         = 1432
        Command Flags  = RPT (0xd0)
        Command Code   = Accounting-Request (271)
        Application Id = Rf-Application (3)
        Hop By Hop Id  = 51
        End To End Id  = 8847360
0 голосов
/ 29 июля 2010

Вы используете строки START в качестве разделителей, поэтому вам нужно немного потанцевать с Perl $/, который является разделителем записи .

#! /usr/bin/perl

use warnings;
use strict;

sub usage { "Usage: $0 input output ..\n" }

die usage unless @ARGV >= 1;
my $input = shift;

my $pid = open my $out, "|-";
die "$0: fork: $!" unless defined $pid;

if ($pid == 0) {  # child
  if (@ARGV) {
    open STDOUT, ">", "/dev/null" or warn "$0: open: $!";
  }
  exec "tee", @ARGV or die "$0: exec: $!";
}

$/ = "START\n";

open my $in, "<", $input or die "$0: open: $!";
my $i = 1;
while (<$in>) {
  chomp;
  next unless /\S/;
  print $out "$i. $_\n";
  ++$i;
}

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

0 голосов
/ 29 июля 2010

Если Perl не обязателен,

$ awk -vRS="START" 'NF{ print $0 > ++c".txt" }' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...