查找文本中的重复单词

查找文本中的重复单词

最常见的拼写错误之一是重复同一个单词两次,就像这里一样。我需要一个自动程序来删除文本文件中所有重复的单词。对于现代编辑器或拼写检查器来说,这应该不是一个奇怪的功能,例如,我记得 MS Word 几年前就引入了此功能!显然,我的操作系统上的默认拼写检查(hun-spell)无法做到这一点,因为它只能查找字典中没有的单词。

有一个适用于 Linux 的特定文本编辑器(pluma/gedit2 或 Sublime-text)的解决方案和一个基于 bash 脚本的解决方案就可以了。

答案1

使用 GNU grep:

echo 'Hi! Hi, same word twice twice, as as here here! ! ,123 123 need' |  grep -Eo '(\b.+) \1\b'

输出:

两次 两次
如同
这儿这儿
123 123

选项

-E:解释(\b.+) \1\b为扩展的正则表达式。

-o:仅打印匹配行中匹配的(非空)部分,每个部分位于单独的输出行上。

正则表达式

\b: 是零宽度字边界。

.+:匹配一个或多个字符。

\1:括号()标记一个捕获组,\1表示这里使用来自第一个捕获组的值。


参考:Stack Overflow 正则表达式常见问题解答

答案2

这听起来就像是你想要的(在每个 UNIX 机器上的任何 shell 中使用任何 awk):

$ cat tst.awk
BEGIN { RS=""; ORS="\n\n" }
{
    head = prev = ""
    tail = $0
    while ( match(tail,/[[:alpha:]]+/) ) {
        word = substr(tail,RSTART,RLENGTH)
        head = head substr(tail,1,RSTART-1) (word == prev ? "" : word)
        tail = substr(tail,RSTART+RLENGTH)
        prev = word
    }
    print head tail
}

$ cat file
the quick quick brown
fox jumped jumped
jumped over the lazy
lazy dogs back

$ awk -f tst.awk file
the quick  brown
fox jumped
 over the lazy
 dogs back

但请提出一个新问题,提供更具代表性的样本输入和预期输出,包括标点符号、大写差异、多个段落、句子开头/结尾的重复单词以及显示各种其他非平凡情况。

答案3

奇怪的是,我会想:

use strict;
use warnings;

local $/;

my $slurp = <DATA>;
$slurp =~ s/\b(\w+)\W\1/$1/go;
print $slurp;

__DATA__
Hi! Hi, same same? word twice twice, as as here here! ! ,123 123 need
need as here 

但请记住 - 很多模式匹配都是面向行的,因此如果跨越行边界,则必须小心。如果您可以排除这种情况,那么您的工作就更轻松了,因为您可以一次解析一行。我没有这样做,所以您最终会将整个文件读入内存。

相关内容