Perl Регулярное выражение Вопрос - PullRequest
2 голосов
/ 05 марта 2011

Я написал программу на Perl, которая читает текст из текстового файла и печатает его.

Я хочу распечатать строку определенного формата.

Например, есть такие строки:

information:
Ahmad.prn:592118:2001:7:5:/Essay
Ashford.rtf:903615:2001:6:28:/usr/Essay
Barger.doc:243200:2001:7:4:/home/dir
end of Information.

Я хочу прочитать только эти три строки:

Ahmad.prn:592118:2001:7:5:/Essay
Ashford.rtf:903615:2001:6:28:/usr/Essay
Barger.doc:243200:2001:7:4:/home/dir

Я думаю, что значение полей:

Ahmad.prn <- file name
592118 <- size of file
2001:7:5 <- created date
/Essay <- path of file

Мой код такой:

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

open (my $infh, "<", $file)||die "cant open";

while(my $line = <$infh>) {
    chomp ($line);
    if ($line =~ /(what regular expression do I have to put in here?)/) {
        print "$line";
    }
}

close ($infh);

Ответы [ 5 ]

3 голосов
/ 05 марта 2011

Если строки, которые вам нужны, всегда заканчиваются на / Essay, вы можете использовать следующее регулярное выражение

/:\/Essay$/

Редактировать 1 : выглядит, что средние части - только цифры, вы можете соответствовать этому.

/:\d+:\d+:\d+:\d+:/
0 голосов
/ 18 августа 2017
$line =~ ([a-zA-Z.]+):(\d+):(\d+):(\d+):(\d+):([\/A-Za-z]+)

$name = $1; #Ahmad.prn
$id = $2; #592118
$year = $3; #2001
$dir = $6; #/Essay 

Примечание: перебрать его для нескольких имен

0 голосов
/ 05 марта 2011
#!/usr/bin/perl
use strict;

my $inputText = qq{
Ahmad.prn:592118:2001:7:5:/Essay
Ashford.rtf:903615:2001:6:28:/usr/Essay
Barger.doc:243200:2001:7:4:/home/dir
end of Information.
};

my @input = split /\n/, $inputText;
my $i = 0;
while ($input[$i] !~ /^end of Information.$/) {
    if ($input[$i] !~ /:/) {
        $i++;
        next;
    }
    my ($fileName, $fileSize, $year, $month, $day, $filePath) = split /:/, $input[$i];
    print "$fileName\t $fileSize\t $month/$day/$year\t $filePath\n";
    $i++;
}
0 голосов
/ 05 марта 2011

Поскольку у вас есть этот формат для Ахмад.прн: 592118: 2001: 7: 5: / Эссе

Ahmad.prn <- file name
592118 <- size of file
2001:7:5 <- created date
/Essay <- path of file

Вы можете использовать это регулярное выражение

/^\s*(\S+):(\d+):(\d+:\d+:\d+):(\S+)\s*$/

При этом у вас будет имя файла в $ 1, размер файла в $ 2, дата создания в $ 3, путь к файлу в $ 4

Я добавил дополнительные пробелы в начале и конце строки, если вы хотите разрешить дополнительные пробелы после или до: вы можете добавить \ s *

0 голосов
/ 05 марта 2011
   $line =~ m{
   ^
   (\w+\.\w+) # filename stored as $1
   :
   (\d+) # size stored as $2
   :
   (\d{4}) # year stored as $3
   :
   (\d+) # month stored as $4
   :
   (\d+) # day stored as $5
   :
   (.*) # path stored as $6
   $
   }x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...