shell script词典

作为比较认真看待英语这回事的人,遇到不懂的词总要查一下。以前我都是通过网页的有道词典查词,但是想想这样的情况:你需要先把焦点移到浏览器,切换到有道词典的标签(假设你的标签常开,否则还得新建标签输入地址),把焦点聚到输入框,最后才能输入单词查询。这样的操作实在太繁琐。

稍微好点的选择是移到mac的widget区域,用自带的查词挂件来查,里边还有英英翻译(要更好地掌握英语,其实应该使用英英翻译的词典)。但是每次都要把焦点移到widget的输入框,也是挺烦的(已经懒到这种程度了么)。再者,一些非标准英语单词(例如emacs)是查不到的,必须借助网络词典。

作为有点系统洁癖的人,能够不额外安装软件,我是不会去安装的。

想来正好借着这个机会加深对shell script的掌握,于是决定用脚本写一个终端的词典。因为终端本身就是需要常常打开的(作为程序员。。),所以只要切换到终端,一条命令就能搞定,又快速又酷炫。

那么怎么来实现呢?一开始想到有道词典有open API。申请了一个key后试了一下,发现返回的结果实在太少。之所以一直用有道,就是因为它的网络搜索结果比较强大(也许是我井底之蛙),一些专有名词还能够给出百科解释。谷歌了一番,发现另一种方式。这种方式,十分暴力,十分费神,十分不人道主义;但是为了完善的查词结果,只好硬着头皮上了。

这种方式就是发送查词请求给dict.youdao.com,把返回的HTML进行分析和处理,筛选我们要的部分。

这是在laichendong的博客上学到的。一开始看到一大串的awk语句,差点没吐出来。转念一想,这样正好,临近Linux期末考试,顺道把sed和awk复习一遍。

主要流程就是,用curl -s 'http://dict.youdao.com/search?q=$1'来获取查词结果的页面,然后用awk从中获取【基本释义】【网络释义】【柯林斯大词典】【词语搭配】【例句】【百科】的内容,然后用sed把HTML的标签等无用信息去除,保存到临时文件里,最后对文件进行read line,用一定的格式和颜色输出到终端界面。

这种做法的弊端很大,首先就是我对着HTML研究了很久,一层层div探索下去,才敲定那些内容是需要取出来的。其次是,对于不同的词,返回的HTML的结构并不是完全一样的。比如ramaxel这个词,就是没有【柯林斯】【词语搭配】等版块的,这导致的结果就是我在根据HTML标签取内容的时候,可能会取到别的内容;又或者取内容的过程没有即时结束,导致取出了不需要的内容(这样说很抽象,自己写一次就知道怎么回事了)。

最后,国际惯例,代码:
github/sunhs/practices/fy.sh

欢迎交流更好的方法!