
bash では、その方法がわかりません。bash スクリプトを実行する必要があります。stdin には、次の形式の字幕の .srt ファイルがあります。
num
HH:MM:SS,SSS --> HH:MM:SS,SSS
text line 1
text line 2
...
テキストのタイトルの HH:MM:SS,SSS の開始と終了。
スクリプトは秒をシフトする必要があります。(+ または - になります)
例:
$cat bmt.srt
5
00:01:02,323 --> 00:01:05,572
Hello, my frieds!
6
....
$./shifter.sh +3<mbt.srt
5
00:01:05,323 --> 00:01:08,572
Hello, my frieds!
6
まず、すべての HH:MM:SS を取得して秒に変換する必要があります。sed を使わずにこれを実行できる人はいますか?
答え1
字幕ファイルが 24 時間を超えない限り、date
次の方法を使用できます。
#!/usr/bin/env bash
set -o errexit -o noclobber -o nounset -o pipefail
date_offset="$1"
shift_date() {
date --date="$1 $date_offset" +%T,%N | cut -c 1-12
}
while read -r line
do
if [[ $line =~ ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9]\ --\>\ [0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9]$ ]]
then
read -r start_date separator end_date <<<"$line"
new_start_date="$(shift_date "$start_date")"
new_end_date="$(shift_date "$end_date")"
printf "%s %s %s\n" "$new_start_date" "$separator" "$new_end_date"
echo "New date"
else
printf "%s\n" "$line"
fi
done
何らかの理由で、これには小数を使用する必要がありますが、機能します。
$ ./shifter.sh "+3.0 seconds" < bmt.srt
5
00:01:05,323 --> 00:01:08,572
New date
Hello, my frieds!
6
答え2
Perl ソリューション。ミリ秒の処理は一般的にサポートが不十分であるため、従来の時間処理モジュールは使用しませんでした。
#!/usr/bin/perl
use warnings;
use strict;
use constant FACTORS => (60 * 60 * 1000,
60 * 1000,
1000,
1);
sub time2ms {
my $time = shift;
my ($ms, $i) = (0, 0);
$ms += (FACTORS)[$i++] * $_ for split /[^0-9]/, $time;
return $ms;
}
sub ms2time {
my $ms = shift;
my $str = q();
for my $i (0 .. 3) {
$str .= sprintf +($i == 3 ? '%03d' : '%02d')
. (':', ':', ',', q())[$i],
$ms / (FACTORS)[$i];
$ms = $ms % (FACTORS)[$i];
}
return $str;
}
my $diff = 1000 * shift;
my $TIME_R = qr/[0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}/;
while (<>) {
if (my ($from, $to) = /($TIME_R) --> ($TIME_R)/) {
my $i = 0;
for my $time ($from, $to) {
$time = time2ms($time) + $diff;
print ms2time($time), (' --> ', "\n")[$i++];
}
} else {
print;
}
}