0

众所周知,.srt文件由具有 3 个底层部分的块构成,如下例所示:

228
00:39:06,680 --> 00:39:13,460
Lorem ipsum dolor sit amet

现在,让我们假设在隐藏式字幕中有一些摘录代表演讲者的演讲,引用了别人的文学作品,比如这个额外的例子:

228
00:39:06,680 --> 00:39:13,460
According to Erasmus, book 1, chapter 23...

问题:我希望通过删除帧号仅从 中提取文本,帧持续时间不擦除,但是,通过VIM.srt作为引用出现在隐藏式字幕中的基数。

尝试:通过使用正则表达式和substitute命令,我找到了一种“删除”持续时间行:%s/\d\d:\d\d:\d\d,\d\d\d --> \d\d:\d\d:\d\d,\d\d\d/ /g和具有相同想法的数字的方法,除了现在搜索每个基数条目并选择/gc绕过文本中的那些。

但是,我有相当数量的此类引文要提取,因此应该保留基数。选择yes/no所有条目变成了一项乏味的任务。

由于我在使用方面缺乏技巧regex,我可以说至少有一种不那么“丑陋”的方式来执行上述策略。也许,一种更优雅的方式不仅可以删除不需要的部分,还可以恢复没有框架和持续时间行的原始文本,例如:

Lorem ipsum dolor sit met
According to Erasmus, book 1, chapter 23...

有人知道该怎么做吗?

4

2 回答 2

2
  1. 不要用空替换该行的内容,实际上删除该行。而不是使用:s/PATTERN//g,使用:g/PATTERN/d(见:help :g
  2. ^使用和锚定您的模式$,仅匹配完全由您要删除的内容组成的行。

放在一起:

:g/^\d\+$/d
:g/^\d\d:\d\d:\d\d,\d\d\d --> \d\d:\d\d:\d\d,\d\d\d$/d

(哇,这是很多“d”)。

这仍然有可能消除仅由数字组成的“对话行” ,但它不会吃掉正好在一行中间的数字。

为了做得更好,我建议使用比 Vim 更适合用途的东西——编程语言或字幕编辑器 :)

于 2016-09-13T04:50:31.047 回答
1

如果您使用锚点,事情会变得容易得多(尽管不一定更好看):

:%s/\v(%^|\n)\zs\d+\n\d{2}(:\d{2}){2},\d{3} --\> \d{2}(:\d{2}){2},\d{3}$\n//

这考虑了序列号和持续时间的耦合,您无需担心文本中间的匹配。

于 2016-09-13T04:50:39.103 回答