Вопрос

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

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

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

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

Log File header
<text>
<text>

<space>

Log File header
<text>
<text>

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

Вот сценарий GreeP 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;

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

Это было полезно?

Решение

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

Есть несколько подходов, особенно потому, что вы знаете, что заголовок будет на совершенно отдельной линии. Во всех следующих примерах предположим, что @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- Глобальный поиск и замена. То .*? Средства выберите что-нибудь, но, как можно меньше, чтобы удовлетворить выражение (не жадный), который чрезвычайно важен в этом приложении.

Обновить: Отредактированная первая техника, в которой я не сможет явно указать, какую переменную выполнить соответствие.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top