Isso é muito parecido com a abordagem do @ goldilock, mas, IMO, é mais simples e pode lidar com linhas vazias no arquivo e substitui |
por uma quebra de linha:
#!/usr/bin/env perl
my ($time, $text, $next_time, $next_text);
my ($c,$i)=0;
while (<>) {
## skip bad lines
next unless /^\s*([:\d]+)\s*:(.+)/;
## If this is the first line. I could have used $. but this is
## safer in case the file contains an empty line at the beginning.
if ($c == 0) {
$time=$1;
$text=$2;
$c++;
}
else {
## This is the counter for the subtitle index
$i++;
## Save the current values
$next_time=$1;
$next_text=$2;
## I am assuming that the | should be interpreted
## as a newline, remove this if I'm wrong.
$text=~s/\|/\n/g;
## Print the previous subttitle
print "$i\n$time,100 --> $next_time,000\n$text\n\n";
## Save the current one for the next line
$time=$next_time; $text=$next_text;
}
}
## Print the last subtitle. It will be dislayed for a minute
## 'cause I'm lazy.
$i++;
$time=~/(\d+:)(\d+)(:\d+)/;
my $newtime=$1 . (sprintf "%02d", $2+1) . $3;
print "$i\n$time,100 --> $newtime,000\n$text\n\n";
Salve o script como um arquivo e torne-o executável e, em seguida, execute:
./script.pl subfile > good_subs.srt
A saída que recebo na sua amostra foi:
1
00:00:44,100 --> 00:01:01,000
" Myślę, więc jestem".
Kartezjusz, 1596-1650
2
00:01:01,100 --> 00:01:06,000
Trzynaste Pietro
3
00:01:06,100 --> 00:01:10,000
Podobno niewiedza uszczęśliwia.
4
00:01:10,100 --> 00:01:13,000
Po raz pierwszy w życiu
zgadzam się z tym.
5
00:01:13,100 --> 00:01:15,000
Wolałbym...
6
00:01:15,100 --> 00:01:19,000
nigdy nie odkryć
tej straszliwej prawdy.
7
00:01:19,100 --> 00:02:19,000
Teraz już wiem...