5.10 基于Web后端的定义查询工具

Google为词汇提供了Web定义,可以用搜索查询“define:WORD”查找,WORD即要查找其定义的词汇。我们得用一个图形界面的Web浏览器才能检索到这些定义,然而,也可以用脚本自动获取所需要的词汇定义。让我们来看看实现方法。

5.10.1 预备知识

我们用lynxsedawkgrep来编写词汇定义工具。

5.10.2 实战演练

从Google搜索检索词汇定义的脚本代码如下:

  1. #!/bin/bash
  2. #文件名: define.sh
  3. #用途: 一个 Google定义的前端工具
  4. limit=0
  5. if [ ! $# -ge 1 ];
  6. then
  7. echo -e "Usage: $0 WORD [-n No_of_definitions]\n"
  8. exit -1;
  9. fi
  10. if [ "$2" = "-n" ];
  11. then
  12. limit=$3;
  13. let limit++
  14. fi
  15. word=$1
  16. lynx -dump http://www.google.co.in/search?q=define:$word | \
  17. awk '/Defini/,/Find defini/' | head -n -1 | sed 's:*:\n*:; s:^[ ]*::'
  18. | \
  19. grep -v "[[0-9]]" | \
  20. awk '{
  21. if ( substr($0,1,1) == "*" )
  22. { sub("*",++count".") } ;
  23. print
  24. } ' > /tmp/$$.txt
  25. echo
  26. if [ $limit -ge 1 ];
  27. then
  28. cat /tmp/$$.txt | sed -n "/^1\./, /${limit}/p" | head -n -1
  29. else
  30. cat /tmp/$$.txt;
  31. fi

运行脚本:

  1. $ ./define.sh hack -n 2
  2. 1. chop: cut with a hacking tool
  3. 2. one who works hard at boring tasks

5.10.3 工作原理

让我们来研究一下定义解析器的核心部分。Lynx用来获取纯文本形式的网页。定义页面的URL是http://www.google.co.in/search?q=define:$word。然后我们减少“Definitions on web”与“Find definitions”之间的文本。所有的定义都出现在这些文本行中(awk '/Defini/,/Find defini/')。

's:*:\n*:' 用来将 * 替换成 \n*,这是为了在每个定义之间插入一个换行符。s:^[ ]*::用来移除行首多余的空格。超链接在 lynx 输出中被标记成 [数字]的形式。这些行可以用grep -v(输出不匹配的行)移除。然后用awk将行首的 * 替换成数字,为每一个定义分配一个序号。如果我们在脚本中使用了 -n countcount在这里表示希望打印的定义数),那就只输出count项定义。因此,用awk打印从编号1到编号count的定义(因为我们已经将 * 替换成了序列号,所以这一步实现起来就容易多了)。

5.10.4 参考

  • 4.6节讲解了sed命令。

  • 4.7节讲解了awk命令。

  • 4.3节讲解了grep命令。

  • 5.3节讲解了lynx命令。