5.10 基于Web后端的定义查询工具
Google为词汇提供了Web定义,可以用搜索查询“define:WORD”查找,WORD即要查找其定义的词汇。我们得用一个图形界面的Web浏览器才能检索到这些定义,然而,也可以用脚本自动获取所需要的词汇定义。让我们来看看实现方法。
5.10.1 预备知识
我们用lynx
、sed
、awk
和grep
来编写词汇定义工具。
5.10.2 实战演练
从Google搜索检索词汇定义的脚本代码如下:
#!/bin/bash
#文件名: define.sh
#用途: 一个 Google定义的前端工具
limit=0
if [ ! $# -ge 1 ];
then
echo -e "Usage: $0 WORD [-n No_of_definitions]\n"
exit -1;
fi
if [ "$2" = "-n" ];
then
limit=$3;
let limit++
fi
word=$1
lynx -dump http://www.google.co.in/search?q=define:$word | \
awk '/Defini/,/Find defini/' | head -n -1 | sed 's:*:\n*:; s:^[ ]*::'
| \
grep -v "[[0-9]]" | \
awk '{
if ( substr($0,1,1) == "*" )
{ sub("*",++count".") } ;
} ' > /tmp/$$.txt
echo
if [ $limit -ge 1 ];
then
cat /tmp/$$.txt | sed -n "/^1\./, /${limit}/p" | head -n -1
else
cat /tmp/$$.txt;
fi
运行脚本:
- $ ./define.sh hack -n 2
- 1. chop: cut with a hacking tool
- 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 count
(count
在这里表示希望打印的定义数),那就只输出count
项定义。因此,用awk
打印从编号1到编号count
的定义(因为我们已经将 *
替换成了序列号,所以这一步实现起来就容易多了)。
5.10.4 参考
4.6节讲解了
sed
命令。4.7节讲解了
awk
命令。4.3节讲解了
grep
命令。5.3节讲解了
lynx
命令。