以自动方式从希腊文本中删除变音符号

mar*_*trz 5 bash diacritics transliteration

我有一个标签文件形式的反编译 stardict 字典

????? <tab> bad
Run Code Online (Sandbox Code Playgroud)

where<tab>表示表格。

不幸的是,定义单词的方式要求查询包含所有变音符号。因此,如果我想搜索 ????,我需要让所有 iotas 和抑扬符都正确。

因此,我想转换整个文件,以便删除关键字的变音符号。所以这条线会变成

????? <tab> <h3>?????</h3> <br/> bad
Run Code Online (Sandbox Code Playgroud)

我知道我可以在 bash 中逐行读取文件,如下所述 [1]

while read line           
do           
    command           
done <file 
Run Code Online (Sandbox Code Playgroud)

但是有什么办法可以使转换线的操作自动化呢?我听说过iconv[2] 但没有设法使用它实现所需的转换。我最好使用 bash 脚本。


此外,是否有一种自动音译希腊语的方法,例如使用 Perseus 的方法?

珀尔修斯的做法


/edit: 也许我们可以使用 Unicode 代码?我们可以注意到U+1F0xU+1F8xforx < 8等都是字母 ? 的变体。这将减少手动工作量。我也接受 C++ 解决方案。

[1] http://en.kioskea.net/faq/1757-how-to-read-a-file-line-by-line
[2]如何从文件中删除所有变音符号?

psm*_*ars 2

您可以使用 Perl 相对轻松地从字符串中删除变音符号:

\n\n
$_=NFKD($_);s/\\p{InDiacriticals}//g;\n
Run Code Online (Sandbox Code Playgroud)\n\n

例如:

\n\n
$ echo '\xe1\xbd\xa6\xe1\xbd\xa2\xe1\xbf\xb6\xe1\xbd\xbc\xcf\x8e\xe1\xbd\xa0\xe1\xbd\xa4 \xe1\xbe\xaa' | perl -CS -MUnicode::Normalize -pne '$_=NFKD($_);s/\\p{InDiacriticals}//g'\n\xcf\x89\xcf\x89\xcf\x89\xcf\x89\xcf\x89\xcf\x89\xcf\x89 \xce\xa9\n
Run Code Online (Sandbox Code Playgroud)\n\n

其工作原理如下:

\n\n
    \n
  • -CS为 Perl 的 stdin/stdout 启用UTF8
  • \n
  • 加载-MUnicode::NormalizeUnicode 规范化库
  • \n
  • -e从命令行执行脚本;-n自动循环输入中的行;-p自动打印输出
  • \n
  • NFKD()将行转换为 Unicode 规范化形式之一;这意味着重音符号和变音符号被分解为单独的字符,这使得下一步更容易删除它们
  • \n
  • s/\\p{InDiacriticals}//g删除 Unicoded 表示为变音符号的所有字符
  • \n
\n\n

事实上,这应该适用于删除具有良好 Unicode 支持的所有脚本/语言的变音符号等,而不仅仅是希腊语。

\n