Как я могу получить абзац в Perl? - PullRequest
1 голос
/ 28 сентября 2010

У меня есть файл журнала, который необходимо правильно отформатировать в удобочитаемый формат. Однако текстовый файл не имеет статического числа строк или фиксированных первичных значений и имеет случайное количество пробелов, но имеет только заголовок файла журнала, который можно использовать для точного указания начала и конца каждого журнала приложения.

Пример файла журнала:

Log File header
<text>
<text>
Log File header
<text>

После того, как скрипт отформатирован, он должен выглядеть примерно так:

Log File header
<text>
<text>

<space>

Log File header
<text>
<text>

Поэтому мне нужен совет по извлечению целого абзаца каждый раз, когда Perl Script обнаруживает «заголовок файла журнала».

Вот скрипт grep perl:

#!/usr/bin/perl

#use 5.010; # must be present to import the new 5.10 functions, notice 
#that it is 5.010 not 5.10

my $file = "/root/Desktop/Logfiles.log";
open LOG, $file or die "The file $file has the error of:\n =>  $!";

@lines = <LOG>;
close (LOG);

@array = grep(/Log File header/, @lines);

print @array;

Может кто-нибудь дать совет по кодам? Спасибо.

1 Ответ

0 голосов
/ 28 сентября 2010

То есть вы просто хотите, чтобы между разделами вашего файла журнала было вертикальное пространство?

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

Итак, первая техника: вставьте пробелы перед заголовком:

foreach my $line ( @lines ) {
    if ( $line =~ m/Log File header/ ) {
        print( "\n\n\n" ); # or whatever you want <space> to be
    }

    print( $line );
}

Следующим методом является использование регулярного выражения для поиска / замены блоков текста:

my $space = "\n\n\n"; # or whatever you want <space> to be
my $everything = join( "", @lines );
$everything =~ s/(Log File header.*?)(?=Log File header)/$1$space/sg;
print( $everything );

Некоторое объяснение о регулярном выражении. (?= означает «просмотр вперед», который будет соответствовать, но не будет частью заменяемого выражения. Модификаторы /sg означают s - перевод строки в обычный пробел и g - глобальный поиск и замена. .*? означает выбрать что угодно, но как можно меньше, чтобы удовлетворить выражение (не жадное), что чрезвычайно важно в этом приложении.

update : отредактирован первый метод, в котором я не смог явно указать, с какой переменной сопоставлять.

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