5

Одним из наиболее распространенных опечаток является повторение одного и того же слова дважды, как здесь. Мне нужна автоматическая процедура, чтобы удалить все повторяющиеся слова в текстовом файле. Это не должно быть странной функцией для современного редактора или средства проверки орфографии, например, я помню, что MS Word представил эту функцию несколько лет назад! Очевидно, что проверка орфографии по умолчанию в моей ОС (hun-spell) не может этого сделать, поскольку она находит только слова, не входящие в словарь.

Было бы хорошо иметь решение, допустимое для конкретного редактора текстового редактора для linux (pluma/gedit2 или Sublime-text) и решение, основанное на сценарии bash.

2 ответа2

10

С GNU grep:

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

Выход:

twice twice
as as
here here
123 123

Варианты:

-E: интерпретировать (\b.+) \1\b как расширенное регулярное выражение.

-o: выводить только совпадающие (непустые) части совпадающей строки, каждая из которых находится на отдельной выходной строке.

Регулярное выражение:

\b: граница слова нулевой ширины.

.+: Соответствует одному или нескольким символам.

\1: круглые скобки () отмечают группу захвата, а \1 означает использование здесь значения из первой группы захвата.


Справка: Часто задаваемые вопросы по регулярным выражениям переполнения стека

1

Перлы, я бы подумал:

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 

Имейте в виду, однако, что большая часть сопоставления с образцом ориентирована на линии, поэтому вы должны быть осторожны, если пересекаете границы линий. Если вы можете исключить этот случай, то у вас есть более простая работа, потому что вы можете анализировать одну строку за раз. Я этого не делаю, так что вы закончите чтение всего файла в память.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .