Метод командной строки для поиска опечаток в повторяющихся словах с номерами строк

I нашел в другом ответе SE , inxi как очень удобный инструмент:

inxi -Dxx
Drives:    HDD Total Size: 810.2GB (42.9% used)
           ID-1: /dev/sdc model: ST3160827AS size: 160.0GB serial: 5MT2HMH6
           ID-2: /dev/sdb model: WDC_WD3200JD size: 320.1GB serial: WD-WCAMR1302926
           ID-3: /dev/sda model: ST380817AS size: 80.0GB serial: 4MR2EWBE
           ID-4: /dev/sdd model: ST3250824AS size: 250.1GB serial: 9ND08GKX

6
09.02.2016, 04:08
4 ответа

Отредактировано: добавлены install и demo

Необходимо позаботиться хотя бы о некоторых крайних случаях, таких как

  • повторяющиеся слова в конце (и начале) строки.
  • поиск должен быть нечувствительным к регистру, из-за частых ошибок типа The the apple.
  • возможно, вы хотите ограничить поиск только составляющими слова, чтобы не совпадало что-то вроде ( ( a + b) + c ) (повторяющиеся открывающие скобки.
  • Только полные слова должны совпадать, чтобы исключить тезис
  • Когда речь идет о человеческом языке, символы Unicode внутри слов должны правильно интерпретироваться

В целом я рекомендую pcregrep решение:

pcregrep -Min --color=auto '\b([^[:space:]]+)[[:space:]]+\1\b' file

Очевидно, что цвет и номер строки (опция n) необязательны, но обычно приятны.

Установка

В дистрибутивах на базе Debian вы можете установить через:

$ sudo apt-get install pcregrep

Пример

Выполните команду на jefferson_typo. txt, чтобы увидеть:

$ pcregrep -Min --color=auto '\b([^[:space:]]+)[[:space:]]+\1\b' jefferson_typo.txt
1:He has has refused his Assent to Laws, the most wholesome and necessary
3:He has forbidden his Governors to pass Laws of immediate and
and pressing importance, unless suspended in their operation till his
5:Assent should be be obtained; and when so suspended, he has utterly

Выше просто захват текста, но на терминале с поддержкой цвета совпадения окрашиваются:

  • has has
  • and
  • and
  • be be
5
27.01.2020, 20:20

Вам следует взглянуть на почтенные команды diction (1) и style (1) . Они ловят самые разные бу-бу. Есть новые версии (GPLv3 здесь, на Fedora 23).

Установить

Например, в дистрибутивах на основе Debian установите пакет diction , который включает стиль :

$ sudo apt-get install diction

По крайней мере, в Fedora это:

$ dnf install diction

Красный Hat Enterprise (и клонам), вероятно, потребуются:

$ yum install diction

В любом случае, это происходит из пакета исходной разработки GNU под названием diction , поэтому его следует называть одинаковым почти везде.

Пример

$ diction jefferson_typo.txt
jefferson_typo.txt:1: He has [has] refused his Assent to Laws, the [most] wholesome and necessary for the public good.

jefferson_typo.txt:3: He has forbidden his Governors to pass Laws of immediate and [and] pressing importance, unless suspended in their operation till his Assent should be [be] obtained; and when [so] suspended, he has utterly neglected to attend to them.

2 phrases in 2 sentences found.

Pros

  • улавливает повторяющиеся слова, среди прочего

Cons

  • вводит [] маркировку для элементов, не связанных с повторяющимися словами. Например, [so] , вероятно, отмечен, потому что он может считаться посторонним согласно The Elements of Style от Strunk . См. man diction
  • : показанное число не всегда является номером строки исходного ввода, а вместо этого является номером строки, с которой начинается предложение. Так, например, [be] - это исходная строка ввода с номером 5, но здесь он показывает 3 только потому, что [be] является частью предложения, начинающегося в строке 3 . Это немного отличается от того, что вы хотели
5
27.01.2020, 20:20

Поскольку вы отметили этот вопрос с помощью awk , почему бы просто не использовать awk ?

$ awk '
    BEGIN{RS=FS="\\W+"}
    $0==t{printf("%s:%s\t%s %s\n", FILENAME, FNR, t, $0)}
    {t=$0}
' *.txt
highlander_typo.txt:6   one one
jefferson_typo.txt:3    has has
jefferson_typo.txt:29   and and
jefferson_typo.txt:42   be be
kylie_minogue.txt:3 la la

Я не сохранил новую строку в jefferson_typo.txt , потому что он не визуально полезен для меня, но вы можете настроить его по своему вкусу.

2
27.01.2020, 20:20

В качестве дополнения к ответу фонбранда re: инструмент командной строки 'diction'

Если вы хотите искать только повторяющиеся слова и отключите с другими элементами стиля вы можете сделать что-то вроде этого:

diction -n file_to_scan.txt --file empty_file.txt

Флаг -n указывает ему игнорировать встроенный список слов. Однако он не будет работать без списка слов, поэтому - файл empty_file.txt , где empty_file.txt - пустой файл, дает ему список пустых слов.

Итак, единственное, что он делает, это распознает повторения слов.

2
27.01.2020, 20:20

Теги

Похожие вопросы