1

我正在尝试解决包含从右到左文本的字幕文件的问题。仅供参考,srt 文件的格式如下:

subtitle line number
start and end times
one OR MORE lines of text
a blank line

例如:

1
00:00:28,000 --> 00:00:32,500
‫«بر اساس داستانی واقعی»‏


2
00:01:33,279 --> 00:01:38,279
‫«شکارچی روباه»‏
این متن تست است

3
...

我在stackoverflow上找到的解决方案不适用于我的情况,因为它既不是每一行也不是第3行,然后是第7行,然后是第11行,依此类推。
我想在包含“-->”的每一行(例如上面示例中的第 3 行和第 7 行)之后的第一行加上 unicode 字符“RIGHT-TO-LEFT EMBEDDING (U+202B)”。
理想情况下,我还想在分隔一批字幕行(例如上面示例中的第 3 行和第 8 行)的空白行之前的每一行加上 unicode 字符“RIGHT-TO-LEFT MARK (U+200F)”。
例如,有没有办法在 awk 或 sed 中做到这一点?谢谢你。
PS.:我在以下链接中放置了一个包含从右到左文本的示例文件:包含从右到左文本的
示例 srt 文件

4

1 回答 1

2

不幸的是,我不会说、读或写波斯语,所以我无法确定我得到的输出是否有任何意义(除了用十六进制编辑器查看标记是否存在)。因此,我将愚蠢地按照您描述的算法进行。我希望这会产生有用的结果。

由于文件很容易小到可以放入内存中,因此使用 sed 的简单方法是

sed ':a $!{N;ba}; s/-->[^\n]*\n/&\xe2\x80\xab/g; s/\r\?\n\r\?\n/\xe2\x80\x8f&/g' sample_rtl.srt

这工作如下:

:a $!{N;ba}                       # read the whole file into the pattern space

s/-->[^\n]*\n/&\xe2\x80\xab/g     # append u202b (e2 80 ab in UTF-8) to all
                                  # matches of "-->[^\n]*\n", i.e., insert it
                                  # after the newline of every line that
                                  # contains "-->"

s/\r\?\n\r\?\n/\xe2\x80\x8f&/g    # Where there are two line breaks in direct
                                  # succession (\r\?\n to handle Windows line
                                  # breaks, which your sample file has),
                                  # prepend u200f (e2 80 8f in UTF-8) to them.

等效的 Perl 解决方案(因为 BSD sed 中的某些内容似乎与上述不同)是

perl -pe 'BEGIN { undef $/; } s/(-->[^\n]*\n)/\1\xe2\x80\xab/g;s/(\r?\n\r?\n)/\xe2\x80\x8f\1/g' sample_rtl.srt

这几乎是同样的事情。未定义$/意味着 perl 将所有内容都视为一条大“线”(这通常称为“slurp 模式”),然后我们可以应用相同的正则表达式(符号略有不同)。

于 2015-02-19T15:24:52.090 回答