我有一个UTF8编码的txt文件,包含拉丁字母(包括重音字母)中的(大多数)单词,以及希腊语(包括变音符号)中的(一些)单词。
我想找到所有希腊语“句子”(即希腊字母表中的单词,用空格和/或常用标点符号分隔,但没有拉丁字符),并用相同的句子替换,但包含在\ greektext中{...} LaTeX命令。
E.g。应该用\ greektext {Пάτριοςπολιτεία}取代Пάτριοςπολιτεία
基本问题是,是否有可能选择希腊语单词组,即上面定义的希腊语“句子”,用sed。
答案 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