【发布时间】:2011-06-19 22:13:10
【问题描述】:
我正在尝试使用单行 ruby 脚本修复包含一些不正确数据的字幕 (.srt) 文本文件。该文件如下所示:
53
00:03:52,835 --> 00:03:54,835
Boss?... BOSS?!
54
00:03:54,845 --> 00:03:56,990
55
00:0 --> 00:03:58,490
Go!
I want the 55 stanza to look like this:
55
00:03:56,490 --> 00:03:58,490
Go!
第一个时间戳取自第二个时间戳,但减去了 2 秒。
这是我的尝试,但不起作用:
ruby -pi.bak -e 'gsub(/(\d{2}):(\d) --> (\d{2}):(\d{2}):(\d{2}),(\d{3})/, "#{$3}:#{$4}:#{$5},#{$6} --> #{$3}:#{$4}:#{$5.to_i - 2},#{$6}")' *.srt
编辑
因此,正如响应者所指出的,ruby 1.9.2 不支持通过 $1、$2 等语法访问正则表达式捕获。
我最终采用的修复是切换回 ruby 1.8.x,并按照 @mu 的建议使用带有块的 gsub,并使用 @jonas 建议的 Time.utc / strftime 魔法。
这是最终解决方案(在我的系统上 /usr/bin/ruby 是 1.8.6):
/usr/bin/ruby -pi.bak -e 'gsub(/(\d{2}):(\d) --> (\d{2}):(\d{2}):(\d{2}),(\d{3})/) {"#{(Time.utc(1970,1,1, $3,$4,$5) - 2).strftime("%H:%M:%S")},#{$6} --> #{$3}:#{$4}:#{$5},#{$6}"}' *.srt
我现在正在观看带有正确格式字幕的电影。谢谢大家:)
【问题讨论】:
-
为什么一定要在一行中做到这一点?
-
我猜你必须第二次将其解析为某种时间类。否则
00:04:00将严重错误您提出的解决方案。 -
“Now you have two problems.” 您可能应该使用多个正则表达式来执行此操作。
-
@Jonas: 00:04:00 将被
gsub忽略,因为它不匹配,我认为这没有问题。 -
@mu 我的意思是,如果是
00:0 --> 00:04:00,490,从最后一个00中减去2 会让他有麻烦。