用sed包装/替换希腊语编码中的句子

时间:2016-06-04 13:08:20

标签: bash sed utf-8

我有一个UTF8编码的txt文件,包含拉丁字母(包括重音字母)中的(大多数)单词,以及希腊语(包括变音符号)中的(一些)单词。

我想找到所有希腊语“句子”(即希腊字母表中的单词,用空格和/或常用标点符号分隔,但没有拉丁字符),并用相同的句子替换,但包含在\ greektext中{...} LaTeX命令。

E.g。应该用\ greektext {Пάτριοςπολιτεία}取代Пάτριοςπολιτεία

基本问题是,是否有可能选择希腊语单词组,即上面定义的希腊语“句子”,用sed。

1 个答案:

答案 0 :(得分:1)

我认为像这样的正则表达式可能会让你公正:

/([\u0370-\u03FF\u0400-\u04FF]+\s+[\u0370-\u03FF\u0400-\u04FF]+)+/

\u0370-\u03FF是希腊语和科普特语块,\u0400-\u04FF是西里尔语块。

对所有指定的字符执行charinfo这些块将覆盖您:

% charinfo Пάτριος πολιτεία
U+041F CYRILLIC CAPITAL LETTER PE [Lu]
U+03AC GREEK SMALL LETTER ALPHA TONOS [Ll]
U+03C4 GREEK SMALL LETTER TAU [Ll]
U+03C1 GREEK SMALL LETTER RHO [Ll]
U+03B9 GREEK SMALL LETTER IOTA [Ll]
U+03BF GREEK SMALL LETTER OMICRON [Ll]
U+03C2 GREEK SMALL LETTER FINAL SIGMA [Ll]
U+03C0 GREEK SMALL LETTER PI [Ll]
U+03BF GREEK SMALL LETTER OMICRON [Ll]
U+03BB GREEK SMALL LETTER LAMBDA [Ll]
U+03B9 GREEK SMALL LETTER IOTA [Ll]
U+03C4 GREEK SMALL LETTER TAU [Ll]
U+03B5 GREEK SMALL LETTER EPSILON [Ll]
U+03AF GREEK SMALL LETTER IOTA TONOS [Ll]
U+03B1 GREEK SMALL LETTER ALPHA [Ll]

但是AFAIK sed并不能很好地处理多字节字符。以下Perl脚本可以使用:

#!/usr/bin/perl -p
use open qw(:std :utf8);
s/([\x{0370}-\x{03FF}\x{0400}-\x{04FF}]+\s+[\x{0370}-\x{03FF}\x{0400}-\x{04FF}]+)+/\\greektext{$&}/u'

用法:

perl my_script.pl < my_input > my_output