最常见的拼写错误之一是重复同一个单词两次,就像这里一样。我需要一个自动程序来删除文本文件中所有重复的单词。对于现代编辑器或拼写检查器来说,这应该不是一个奇怪的功能,例如,我记得 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
表示这里使用来自第一个捕获组的值。
答案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
但请记住 - 很多模式匹配都是面向行的,因此如果跨越行边界,则必须小心。如果您可以排除这种情况,那么您的工作就更轻松了,因为您可以一次解析一行。我没有这样做,所以您最终会将整个文件读入内存。