使用 sed 以希腊语编码包装/替换句子



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

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

E.g. Пάτριος πολιτεία

should be replace by \greektext{Пάτριος πολιτεία}

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

我认为像这样的正则表达式可能会让您伸张正义:

/([u0370-u03FFu0400-u04FF]+s+[u0370-u03FFu0400-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

最新更新