如何在Bash中找出文本文件中的拼写错误单词
解决文本拼写错误检测问题
针对你的需求——从带大小写、标点的文本中找出不在词典里的错误单词(包括带标点的合法单词),可以通过预处理词典+文本分词校验的组合命令实现,下面是具体步骤:
步骤1:预处理词典文件
首先把你的词典文件(比如dict.txt,内容是a、description、of、task、to、do)转换成每行一个小写单词的格式,方便后续匹配:
sed 's/、/\n/g' dict.txt | tr '[:upper:]' '[:lower:]' | sort -u > clean_dict.txt
解释:
sed 's/、/\n/g':把中文顿号分隔的内容换成换行,拆分每个词tr '[:upper:]' '[:lower:]':统一转成小写,消除大小写差异sort -u:去重并排序(可选,但能加快后续查询)
步骤2:编写校验脚本
用awk编写脚本(保存为check_errors.awk),实现以下逻辑:
- 加载预处理后的词典到内存数组
- 遍历文本文件的每个单词,保留原词
- 生成该单词的"干净版本":转小写+去除所有标点
- 判断:如果干净版本不在词典里,或者原词带有标点,就输出原词
脚本内容:
BEGIN { # 加载干净词典到数组 while ((getline line < "clean_dict.txt") > 0) { valid_words[line] = 1 } close("clean_dict.txt") # 定义需要匹配的标点符号集合 punct_regex = /[[:punct:]]/ } # 处理每行的每个单词 { for (i = 1; i <= NF; i++) { original = $i # 生成干净版本:转小写+去标点 clean = tolower(original) gsub(/[[:punct:]]/, "", clean) # 判断是否输出:干净词不在词典,或者原词带标点 if (!(clean in valid_words) || original ~ punct_regex) { print original } } }
步骤3:运行脚本并输出结果
假设你的文本文件是text.txt(内容:A discreption of a task to do.),执行命令:
awk -f check_errors.awk text.txt > errors.txt
打开errors.txt就能看到期望的结果:
discreption do.
为什么之前的工具没用?
你试过的diff/comm/cmp都是基于整行或整字符串的精确对比,没法处理大小写、标点的干扰;grep默认也是精确匹配,除非写复杂的正则,但很难兼顾所有情况。而上面的方法先统一格式,再分条件判断,能精准匹配你的需求。
内容的提问来源于stack exchange,提问作者Em Manuel
相关产品推荐
相关产品推荐

