如何在不通过 VIM 删除隐藏式字幕中出现的数字的情况下清理 .srt 文件?
How to clean a .srt file without removing numbers that appear in the closed captions through VIM?
众所周知,.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...
问题:我想通过删除帧号,只提取.srt
中的文本,不删除帧持续时间,但是,出现的基数通过 VIM.
在隐藏式字幕中引用
尝试: 通过使用正则表达式和 substitute
命令,我找到了 "delete" 持续时间线 :%s/\d\d:\d\d:\d\d,\d\d\d --> \d\d:\d\d:\d\d,\d\d\d/ /g
的方法和具有相同想法的数字,除了现在使用选项 /gc
来搜索每个基数条目以绕过文本中的那些。
不过,我有相当多的这样的语录需要摘录,所以要保留基数。为所有条目选择 yes/no
变成了一项繁琐的任务。
由于我在使用 regex
方面缺乏技巧,我想说至少有一种 "ugly" 方式来执行上述策略。也许,一种更优雅的方法不仅可以删除不需要的部分,还可以恢复没有帧和持续时间线的原始文本,例如:
Lorem ipsum dolor sit met
According to Erasmus, book 1, chapter 23...
有人知道怎么做吗?
- 不要把该行的内容替换成空的,实际删除该行。不要使用
:s/PATTERN//g
,而是使用 :g/PATTERN/d
(参见 :help :g
)
- 使用
^
和 $
锚定您的模式,以仅匹配 完全 您要删除的内容的行。
合计:
:g/^\d\+$/d
:g/^\d\d:\d\d:\d\d,\d\d\d --> \d\d:\d\d:\d\d,\d\d\d$/d
(哇,这么多 "d")。
这仍然有可能对仅包含 个数字的 "line of dialog" 进行核攻击,但它不会吃掉 [=24= 中的数字]中间一行。
为了做得更好,我建议使用比 Vim 更适合用途的东西 — 编程语言或字幕编辑器 :)
如果你使用锚点,事情会变得容易得多(虽然不一定更好看):
:%s/\v(%^|\n)\zs\d+\n\d{2}(:\d{2}){2},\d{3} --\> \d{2}(:\d{2}){2},\d{3}$\n//
这考虑了序号和时长的耦合,你不需要担心在文本中间匹配。
众所周知,.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...
问题:我想通过删除帧号,只提取.srt
中的文本,不删除帧持续时间,但是,出现的基数通过 VIM.
尝试: 通过使用正则表达式和 substitute
命令,我找到了 "delete" 持续时间线 :%s/\d\d:\d\d:\d\d,\d\d\d --> \d\d:\d\d:\d\d,\d\d\d/ /g
的方法和具有相同想法的数字,除了现在使用选项 /gc
来搜索每个基数条目以绕过文本中的那些。
不过,我有相当多的这样的语录需要摘录,所以要保留基数。为所有条目选择 yes/no
变成了一项繁琐的任务。
由于我在使用 regex
方面缺乏技巧,我想说至少有一种 "ugly" 方式来执行上述策略。也许,一种更优雅的方法不仅可以删除不需要的部分,还可以恢复没有帧和持续时间线的原始文本,例如:
Lorem ipsum dolor sit met
According to Erasmus, book 1, chapter 23...
有人知道怎么做吗?
- 不要把该行的内容替换成空的,实际删除该行。不要使用
:s/PATTERN//g
,而是使用:g/PATTERN/d
(参见:help :g
) - 使用
^
和$
锚定您的模式,以仅匹配 完全 您要删除的内容的行。
合计:
:g/^\d\+$/d
:g/^\d\d:\d\d:\d\d,\d\d\d --> \d\d:\d\d:\d\d,\d\d\d$/d
(哇,这么多 "d")。
这仍然有可能对仅包含 个数字的 "line of dialog" 进行核攻击,但它不会吃掉 [=24= 中的数字]中间一行。
为了做得更好,我建议使用比 Vim 更适合用途的东西 — 编程语言或字幕编辑器 :)
如果你使用锚点,事情会变得容易得多(虽然不一定更好看):
:%s/\v(%^|\n)\zs\d+\n\d{2}(:\d{2}){2},\d{3} --\> \d{2}(:\d{2}){2},\d{3}$\n//
这考虑了序号和时长的耦合,你不需要担心在文本中间匹配。