Znajdź powtarzające się słowa w tekście

5

Jednym z najczęstszych literówek jest powtórzenie tego samego słowa dwa razy, jak tutaj. Potrzebuję automatycznej procedury, aby usunąć wszystkie powtarzające się słowa z pliku tekstowego. Nie powinno to być dziwną funkcją dla nowoczesnego edytora lub sprawdzania pisowni, na przykład pamiętam, że MS Word wprowadził tę funkcję kilka lat temu! Najwyraźniej domyślna funkcja sprawdzania pisowni w moim systemie operacyjnym (hun-spell) nie może tego zrobić, ponieważ znajduje tylko słowa, których nie ma w słowniku.

Byłoby OK mieć rozwiązanie poprawne dla konkretnego edytora edytora tekstowego dla systemu Linux (pluma / gedit2 lub Sublime-text) oraz rozwiązanie oparte na skrypcie bash.

altroware
źródło
1
Czy perl jest akceptowalną alternatywą dla bash? Bo to byłby mój pierwszy port zawinięcia.
Sobrique
@Sobrique Proszę dodać! Wolałbym jednak odpowiedzi oparte na bashu
altroware

Odpowiedzi:

11

Z GNU grep:

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

Wynik:

dwa razy dwa razy
jak
tutaj tutaj
123 123

Opcje :

-E: Interpretuj (\b.+) \1\bjako rozszerzone wyrażenie regularne.

-o: Wydrukuj tylko dopasowane (niepuste) części pasującej linii, przy czym każda taka część znajduje się w osobnej linii wyjściowej.

Regex :

\b: Jest granicą słów o zerowej szerokości.

.+: Dopasowuje jeden lub więcej znaków.

\1: Nawiasy ()oznaczają grupę przechwytywania i \1oznaczają użycie tutaj wartości z pierwszej grupy przechwytywania.


Odniesienie: Często zadawane pytania dotyczące przepełnienia stosu

Cyrus
źródło
Twoje polecenie grep kończy się niepowodzeniem w następującym typie przykładu: echo „teza” | grep -Eo '(\ b. + \ b) \ 1' wyjścia: the. grep -Eo '(\ b. +) \ 1 \ b' wydaje się jednak działać. Wiesz, dlaczego?
el_tenedor
@el_tenedor: Dziękuję za tę wskazówkę. Dodałem \bpo drugim ciągu, aby naprawić ten błąd podciągania.
Cyrus
Mimo to drugi \ b w nawiasie wydaje się zbędny. Dlaczego tego potrzebujemy?
el_tenedor
Tak, jest zbędny i można go pominąć.
Cyrus
Zaktualizowałem swoją odpowiedź.
Cyrus
1

Perlish, pomyślałbym:

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 

Pamiętaj jednak - wiele dopasowanych wzorów jest zorientowanych liniowo, więc musisz być ostrożny, jeśli przekroczysz granice linii. Jeśli możesz wykluczyć ten przypadek, masz łatwiejszą pracę, ponieważ możesz przeanalizować jedną linię na raz. Nie robię tego, więc skończysz wczytywanie całego pliku do pamięci.

Sobrique
źródło
To świetnie, wolałem odpowiedź opartą na bashu, ale to też jest OK.
altroware
Perl jest w prawie tak wielu miejscach jak bash i jest pełniej opisany jako język programowania.
Sobrique,