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

Unicode 将bidi标记字符添加到特定行的开头/结尾,unicode,awk,sed,right-to-left,bidi,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 ‫«شکارچی روباه»‏ این متن ت

我正在尝试修复包含从右向左文本的字幕文件的问题。仅供参考,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行等等
我想用unicode字符“从右到左嵌入(U+202B)”,作为包含“->”的每一行(例如上面示例中的第3行和第7行)后面的第一行的前缀。
理想情况下,我还想在每一行分隔一行字幕行(例如,上面示例中的行3和8)的空白行后面加上Unicode字符“右到左标记(U+200 f))。 例如,在awk或sed中是否有这样做的方法?谢谢。
注:我在以下链接中放置了一个包含从右到左文本的示例文件:

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

由于文件很容易小到可以放入内存,因此使用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解决方案(因为BSDSED中的某些内容似乎与上述内容不同)是


这几乎是一样的。取消定义
$/
意味着perl将所有内容都视为一个大“行”(这通常被称为“slurp模式”),然后我们可以应用相同的正则表达式(使用稍微不同的符号)。

非常感谢。我在Mac OS X Yosemite终端上尝试了该命令。输出文件正常工作(即与我自己的努力相比,它没有损坏)。但是,最终结果与我从原始文件中得到的结果相同;i、 就好像没有插入字符一样。因此,我对这些文件进行了区分,并根据我所看到的,这些文件似乎是相同的。我不知道为什么它没有插入字符。也许terminal正以另一种方式处理包含波斯语文本的行;考虑到这条线的起点在最左边,而不是右边,就像它应该的那样。哦,是波斯语?抱歉把它和阿拉伯语混在一起了(你可能已经猜到了,我两个都不知道)。您使用的是Mac OS X可能与此问题有关;它与BSD sed一起提供,而我使用GNU sed进行测试——后者在Linux上很常见,并且在BSD sed上有许多扩展。我会把它翻译成awk;也许我们的运气更好。或者Perl。Mac OS X上有Perl,不是吗?没问题。这是常见的错误再次感谢你的努力。同时,我也会在我的Ubuntu虚拟机和Raspbian上试用,看看效果如何;事实证明,在awk中这样做有点麻烦,因为awk没有背景。它做完全相同的事情,但是使用Perl它应该是可移植的。(祈求好运)我明白你的意思,我想这可能意味着视频播放器不能按照规范处理字幕中的双向Unicode。似乎有很多东西不能正确支持它——我尝试过的一些程序以你想要的方式显示了原始文件,有些无法完全做到这一点。值得一提的是,如果我正确地阅读了规范,您必须用PDF(U+202C)平衡每个嵌入标记。您可以通过将上述代码中的
\xe2\x80\x8f
替换为
\xe2\x80\xac
(在每段末尾弹出)来实现这一点。这在Perl中非常容易实现。你可以考虑使用它。在处理现代文本时,将自己局限于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