Вопрос: Найти повторяющиеся слова в тексте


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

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


4
2017-11-22 22:46


Источник


Является ли perl приемлемой альтернативой bash? Потому что это будет мой первый порт захода. - Sobrique
@Sobrique Пожалуйста, не стесняйтесь добавлять! Я бы предпочел основанные на bash ответы, хотя - altroware


Ответы:


С 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: Печатать только согласованные (непустые) части соответствующей строки, причем каждая такая часть находится на отдельной выходной строке.

Regex:

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

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

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


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


9
2017-11-23 09:30



Ваша команда grep не подходит для следующего типа примера: echo «thesis» | grep -Eo '(\ b. + \ b) \ 1' выходы:. grep -Eo '(\ b. +) \ 1 \ b', похоже, работает. Любая идея почему? - el_tenedor
@el_tenedor: Спасибо за этот намек. Я добавил \b после второй строки, чтобы исправить эту ошибку подстроки. - Cyrus
Тем не менее, второй \ b в скобках кажется избыточным. Зачем нам это нужно? - el_tenedor
Да, он избыточен и может быть опущен. - Cyrus
Я обновил свой ответ. - Cyrus


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

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 

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


1
2017-11-23 13:25



Это здорово, я предпочитаю баш-ответ, но это нормально. - altroware
Perl находится почти в таком же количестве мест, что и bash, и более полно представлен в качестве языка программирования. - Sobrique