【问题标题】:Perform math on one-line ruby script gsub regex captures对一行 ruby​​ 脚本 gsub 正则表达式捕获执行数学运算
【发布时间】: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 会让他有麻烦。

标签: ruby regex shell


【解决方案1】:

您几乎拥有它,但您想使用 block form of gsub 而不是两个参数形式,我认为您的减法在 ---> 的错误一侧:

ruby -pi.bak -e '$_.gsub(/(\d{2}):(\d) --> (\d{2}):(\d{2}):(\d{2}),(\d{3})/) { "#{$3}:#{$4}:#{$5.to_i - 2},#{$6} --> #{$3}:#{$4}:#{$5},#{$6}" }' *.srt

Ruby 1.8 不需要带有 gsub 块形式的 $_,但 1.9 需要。全球的$1$2、...不是你想的那样except in block form of gsub

如果替换是一个字符串,它将被替换为匹配的文本。 [...] 但是,在 replacement 中,特殊匹配变量(例如 &$)不会引用当前匹配。

在块形式中,当前匹配字符串作为参数传入,$1、$2、$`、$&、$'等变量会被适当设置。

Jonas Elfström 在 cmets 中关于从“00:04:00”中的秒数中减去 2 造成混乱的说法是正确的。因此,您可能希望使用其中一个时间类来处理减法。像这样的:

(Time.utc(1970,1,1, $3,$4,$5) - 2).strftime('%H:%M:%S')

代替您的#{$3}:#{$4}:#{$5.to_i - 2},#{$6} 应该可以解决问题。 Time.utc 想要使用完整的日期时间而不仅仅是时间,因此使用 Unix 纪元 (1970-01-01) 来解决这个问题有点小技巧。当然,如果你尝试从 00:00:00 中减去 2s,你会遇到一些问题。

【讨论】:

  • 由于某种原因,当我使用 gsub 的块形式(根据您的 sn-p)时,它只是生成一堆 Enumerable 对象并在这些对象上调用 to_s。输出如下所示:#<0x0b5aa4><0x0b5a40><0x0b59f0><0x0b59a0><0x0b5950><0x0b5900><0x0b58b0>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
相关资源
最近更新 更多