将bidi标记字符添加到特定行的开头/结尾

时间:2015-02-19 14:13:45

标签: unicode awk sed right-to-left bidi

我正在尝试修复包含从右到左文本的字幕文件的问题。仅供参考,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

1 个答案:

答案 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模式”),然后我们可以应用相同的正则表达式(略有不同的表示法)。