寻找终端命令来解析MacOSX字典数据文件

时间:2014-03-22 16:48:46

标签: macos dictionary terminal applescript automator

问题

MacOSX附带存储在/Library/Dictionaries中的词典。我想解析它们以编程方式获取字典结果(通过Terminal,AppleScript或Automator)。字典是MacOSX包,并且都有一个Contents文件夹,其中包含一个名为Body.data的文件。我想解析该文件的UTF-8字符串(可能是中文字符双字节)并返回找到字符串的行。

我已尝试过以下操作,但未返回任何结果:

find . -name 'Body.data' -exec grep -li '我' {} \;

当我使用app界面搜索字典时,我可以找到合适的文本。我的目标是创建一个工作流服务,将选定的中文文本转换为存储在系统/用户词典中的拼音等价物。

更新

根据接受的答案,以下内容对我有用:

使用Xcode使用以下代码创建并存档名为rdef的命令行实用程序:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        if(argc < 2)
        {
            printf("Usage: rdef <word to define>");

            return -1;
        }

        NSString * search =
        [NSString stringWithCString: argv[1] encoding: NSUTF8StringEncoding];

        CFStringRef def =
        DCSCopyTextDefinition(NULL,
                              (__bridge CFStringRef)search,
                              CFRangeMake(0, [search length]));

        NSString * output =
        [NSString stringWithFormat: @"Definition of <%@>: %@", search, (__bridge NSString *)def];

        printf("%s", [output UTF8String]);


    }
    return 0;
}

在我的项目框架中添加了以下内容:

frameworks-added

执行构建,然后使用以下步骤手动部署。

部署:

右键单击Archived包并选择Show in Finder。然后显示包内容并向下钻取产品文件夹并将可执行文件复制到/local/usr/bin。现在从命令提示符我可以像这样运行实用程序:

rdef 我|awk -F '\|' '{ gsub(/^ +| +$/, "", $2); print $2 }'

请参阅下面接受的答案以获取扩展参考资料。

NB: 可以在https://github.com/mingsai/rdef.git

找到该实用程序的github

接下来我将创建一个服务,从Automator中针对所选文本调用该实用程序。

服务解决方案

为有帮助的人付费,特别是@ mklement0:这是获取命令实用程序并将其转换为可用于将中文字符翻译为拼音的MacOSX服务的解决方案。

创建一个新的Automator服务文件,并确保选择输出替换所选文本。

MacOSX Service - Convert Chinese to Pinyin

Automator脚本详情

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin/: 
export PATH
LC_CTYPE=UTF-8
x=$1

for ((i=0;i<${#x};i++)); do rdef "${x:i:1}" | awk -F  '\|' 'BEGIN {ORS=" "}{ gsub(/^ | +?/, "", $2); if (length($2) > 0) print $2 ; exit}'; done

使服务&#34;生活&#34;只需删除&#34; Ask for Text&#34;并使用您选择的名称保存服务(例如转换为拼音)。

要使用修改后的服务突出显示任何中文字符并右键单击上下文菜单,然后在“服务”菜单下方选择&#34;转换为拼音&#34; ......(如下所示)

用法

highlighted text

Service-Selection

生成此输出

output

希望能帮助解决这个问题的人。

2 个答案:

答案 0 :(得分:1)

我查看了Chinese SimplifiedOxford English Dictionary,并且两者都有一个ContentsBody.data文件。但是,如果我跑

file Body.data

它只是说data(而不是ASCII文本,或UTF-8) - 意味着文件是二进制而不是ASCII所以grep和它的朋友不会很好地工作在他们身上。

如果有人擅长从十六进制转储中发现文件类型,那么文件就像这样开始:

0000000      0000    0000    0000    0000    0000    0000    0000    0000
          \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0000100      c9a8    0106    0000    0000    ffff    ffff    0020    0000
         250 311 006 001  \0  \0  \0  \0 377 377 377 377      \0  \0  \0
0000120      0000    0000    0207    0000    ffff    ffff    ffff    ffff
          \0  \0  \0  \0  \a 002  \0  \0 377 377 377 377 377 377 377 377
0000140      8009    0000    8005    0000    8c22    0004    9c78    bddc
          \t 200  \0  \0 005 200  \0  \0   " 214 004  \0   x 234   ܽ  **
0000160      6c6b    db1b    2f7e    e416    49a6    349a    c5b8    902d
           k   l 033 333   ~   / 026 344 246   I 232   4 270 305   - 220
0000200      fda2    7134    7880    d4ef    2cb6    96d9    9dad    f673

答案 1 :(得分:1)

grep对文本文件进行操作,但遗憾的是Body.data文件不是文本文件。

您最好的选择可能是在Xcode中创建自己的命令行实用程序,如此处所示(示例代码):https://discussions.apple.com/thread/2679911

这是Apple的词典API文档:https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/DictionaryServicesProgGuide/access/access.html#//apple_ref/doc/uid/TP40006152-CH5-SW1

<强>更新

假设您已经创建了一个名为rdef的实用程序,它返回'Definition of <我>: | wǒ | I me my'之类的内容,请使用以下awk命令来解析拼音:

rdef "我" | awk -F ' *[|] *' '{ print $2 }'

或者,如果可以选择基于在线的解决方案,您可以尝试使用基于Google翻译的解决方案。

至少在交互式使用中,您会在输入字段下方获得拼音转录。

例如,您的示例符号转录为“Wǒ”:

http://translate.google.com/?text=%E6%88%91#zh-CN/en/%E6%88%91