Как я могу обрезать содержимое файла в Perl? - PullRequest
0 голосов
/ 04 октября 2010

Я хотел бы удалить содержимое файла от определенного символа до определенного символа в файле в Perl.Как мне сделать это с помощью скрипта?

Файл имеет это:

Syslog logging: enabled (11 messages dropped, 2 messages rate-limited,
                0 flushes, 0 overruns, xml disabled, filtering disabled)
    Console logging: level informational, 81 messages logged, xml disabled,
                     filtering disabled
    Monitor logging: level debugging, 0 messages logged, xml disabled,
                     filtering disabled
    Buffer logging: level informational, 28 messages logged, xml disabled,
                    filtering disabled
    Logging Exception size (4096 bytes)
    Count and timestamp logging messages: disabled

No active filter modules.

    Trap logging: level informational, 83 message lines logged

Log Buffer (4096 bytes):

*Oct  4 13:42:03.210: %SEC_LOGIN-5-LOGIN_SUCCESS: Login Success [user: ] [Source: ] [localport: ] at UTC Mon Oct 4 2010

И новый файл после обрезки должен быть этот

*Oct  4 13:42:03.210: %SEC_LOGIN-5-LOGIN_SUCCESS: Login Success [user: ] [Source: ] [localport: ] at UTC Mon Oct 4 2010

Ответы [ 3 ]

2 голосов
/ 04 октября 2010

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

$ perl -ne 'print unless /start_skip/ .. /end_skip/' in.txt > out.txt

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

$ perl -ne 'print if /^\*/' in.txt > out.txt
1 голос
/ 04 октября 2010

Если я хорошо понимаю ваши потребности, вы можете сделать что-то вроде:

Я обновил в соответствии с вашими новыми спецификациями

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

my $in_file = 'foo.txt';
my $out_file = 'bar.txt';

open my $fh_in, '<', $in_file or die "unable to open '$in_file' for reading: $!";
open my $fh_out, '>', $out_file or die "unable to open  '$out_file' for writing: $!";

while(<$fh_in>) {
    chomp;

    # updated according to new requirements
    next if (/^Syslog logging/ .. /^Log Buffer/);
    next if (/^$/);

    print $fh_out $_,"\n";
}
close $fh_in;
close $fh_out;

Этот скрипт читает файл foo.txt и записывает строки в файл bar.txt, за исключением тех, которые включены между begin_skip и end_skip.

begin_kip и end_skip может быть любым регулярным выражением.

0 голосов
/ 04 октября 2010

Хм, вопрос не очень понятный. Я думаю, вы хотите удалить определенные строки в файле.

#!/usr/bin/perl

$filename = $ARGV[0];
$a = $ARGV[1];
$b = $ARGV[2];

open (FILE, $filename) || die ("Can't open the file");
open (INFILE, ">$filename.tmp") || die ("Can't open the temp file");

while ($line = <FILE>) {
    $line =~ s/$a.*$b/$a$b/g;
    print INFILE $line
}
close (INFILE);
close (FILE);

Я предполагаю, что вы ожидаете здесь "$ line = ~ s / $ a. * $ B / $ a $ b / g;" Он заменяет только содержимое строки, но не фактическую строку. Вы можете просто вызвать Sed Script

sed 's/a.*b/ab/g' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...