shell脚本学习指南[五](Arnold Robbins & Nelson H.F. Beebe著)

2019-09-23 09:42:00王振洲

后续的有改良的命令ispell和aspell,有一个不错的功能就是可以提供本地有效的单词拼写列表,如:spell +/usr/local/lib/local.words myfile > myfile.errs
针对所写文档提供哦功能私有拼写字典,非常重要,这能使拼写检查更高效准确。但是spell还有一些棘手的事情,即locale变动后会使命令达不到预期效果如:


$ env LC_ALL=en_GB spell +ibmsysj.sok < ibmsysj.bib | wc -l
   3674
$ env LC_ALL=en_US spell +ibmsysj.sok < ibmsysj.bib | wc -l
   3685
$ env LC_ALL=en_C spell +ibmsysj.sok < ibmsysj.bib | wc -l
   2163

默认的locale在操作系统版本之间可能有所不同。因此最好的方式便是将LC_ALL环境变量设置与私人字典排序一致,再执行spell。env命令的作用是在重建的环境中运行命令。

书中展现了spell的awk版本,也展现awk的强大。为引导程序进行,先列出我们预期的设计目标:
1、程序将会能够读取文字数据流、隔离单词、以及报告不在已知单词列表的单词。
2、将会有一个默认的单词列表,由一个或多个系统字典收集而成。
3、它将可能取代默认的单词列表。
4、标准单词列表将有可能由一个或多个用户所提供的单词列表而扩增。该列表在技术性文件上特别有用,例如首字母缩写、术语及专有名词等。
5、单词列表将无须排序。
6、虽然默认单词列表都是英文,但辅以适当的替代性单词列表,程序将可能处理任何语言的文字,只要它是以基础为ASCII的字符集呈现,以空白字符分隔单词。
7、忽略字母大小写,让单词列表维持在易于管理的大小,但异常报告采用原大小写。
8、忽略标点符号,但顿点符号(缩写的撇)将视为字母。
9、默认的报告将为排序后具有独一无二单词的列表以一行一个单词的方式呈现。为拼写异常列表。
10、将可通过选项增加异常列表报告,并有位置信息,如文件名行号等,以利于寻找异常单词。报告将以位置排序,且当他们在同一位置发现多个异常时,则进一步依异常单词排序。
11、支持用户可指定的后缀缩写,让单词列表保持在易于管理的大小。


#语法:
#   awk [-v Dictionaries="sysdict1 sysdict2 ..."] -f spell.awk --
#       [=suffixfile1 =suffixfile2 ...] [+dict1 +dict2 ...]
#       [-strip] [-verbose] [file(s)]

BEGIN   { initialize() }
        { spell_check_line() }

END     { report_exceptions() }

function get_dictionaries( files, key){
    if((Dictionaries == "") && ("DICTIONARIES" in ENVIRON))
        Dictionaries = ENVIRON["DICTIONARIES"]