我正在尝试修复包含从右到左文本的字幕文件的问题。仅供参考,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。:我在下面的链接中放置了一个包含从右到左文本的示例文件:
sample srt file containing right-to-left text
答案 0 :(得分: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模式”),然后我们可以应用相同的正则表达式(略有不同的表示法)。