Проверка орфографии в командной строке Unix

Краткое введение
Раньше, до повсеместных графических редакторов со встроенной проверкой, орфографию проверяли прямо в терминале. На большинстве Unix-подобных систем есть файл словаря (обычно /usr/share/dict/words), где каждое слово расположено в отдельной строке. Задача сводится к тому, чтобы получить из документа отсортированный список уникальных слов в нижнем регистре и сравнить его со словарём.
Определение: tr — утилита для замены или удаления символов; comm — утилита для построчного сравнения двух отсортированных файлов.
Пошаговый метод (надёжный вариант)
- Привести текст к нижнему регистру (лучше использовать POSIX-класс символов).
- Удалить знаки препинания, которые мешают разделению слов.
- Преобразовать разделители (пробелы) в перенос строки, чтобы каждое слово было на своей строке.
- Отсортировать и удалить дубли.
- Сравнить полученный список со словарём с помощью comm или grep.
Надёжная последовательность команд
cat document | tr '[:upper:]' '[:lower:]' | tr -d ',.:;()?!"' | tr "[:space:]" "\n" | sort | uniq > doc_words
sort /usr/share/dict/words | tr '[:upper:]' '[:lower:]' | uniq > words
comm -23 doc_words wordsПояснения:
- tr ‘[:upper:]’ ‘[:lower:]’ — корректная и локально-независимая конвертация в нижний регистр.
- tr -d ‘,.:;()?!”‘ — удаляет знаки пунктуации, мешающие формированию «чистых» слов. Подберите набор символов под ваш язык/текст.
- tr “[:space:]” “\n” — превращает все пробельные символы в переносы строк (учёт табуляции и разных переводов строки).
- sort + uniq — получаем отсортированный список уникальных слов.
- comm -23 — печатает строки, которые есть в первом файле, но отсутствуют во втором (то есть кандидаты на ошибку).
Важно: comm требует, чтобы оба файла были отсортированы одинаково. Поэтому мы предварительно сортируем и словарь.
Пример: документ с опечатками
Содержимое файла document:
$ cat document
Early Unix didn't have word procesors like we thikn of them today. Instead,
you wrote a plain text document that might have embedded special commands to
underline text or create a list of bulet points. But how did you check the
spelling of your document?Команды и результат (упрощённо):
$ cat document | tr '[:upper:]' '[:lower:]' | tr -d ',.:;()?!"' | tr "[:space:]" "\n" | sort | uniq | comm -23 - words
bulet
procesors
thiknЭти строки — слова из документа, отсутствующие в словаре — кандидаты на орфографические ошибки.
Частые проблемы и когда метод не сработает
- Словарь не соответствует вашему языку или домену. Технические термины, имена собственные, аббревиатуры и сленг часто отсутствуют.
- Форматы с встроенной разметкой (HTML, Markdown, LaTeX) содержат теги и команды — их нужно предварительно очищать (sed/awk).
- Словарь может содержать как прописные, так и строчные варианты (например, “Minnesota” и “minnesota”), что нарушит сортировку и работу comm, если не нормализовать регистр и не удалить дубли.
- Метод не учитывает контекст: «read» vs «read» (разное произношение) и грамматику — только орфография.
Альтернативные, более простые и практичные инструменты
- aspell (рекомендуется для быстрой интерактивной проверки):
aspell list < document | sort -uaspell возвращает список слов, не найденных в его словаре. Он поддерживает словари для многих языков и умеет подсказывать варианты.
- hunspell (используется в LibreOffice/Firefox):
hunspell -l document | sort -u- grep/fgrep как альтернатива comm (если не хочется сортировать словарь вручную):
# doc_words — уникальные слова из документа, words — подготовленный словарь
grep -F -x -v -f words doc_wordsгде флаги означают: -F (фиксированные строки), -x (совпадение всей строки), -v (вывести несовпадающие), -f (шаблоны из файла).
- Для разметки (Markdown/HTML) сначала удалите теги: sed ‘s/<[^>]*>//g’ или специализированные парсеры, затем примените процесс проверки.
Мини‑методология (короткий чек-лист для запуска)
- Скопируйте document в рабочую папку.
- Подготовьте словарь: sort /usr/share/dict/words | tr ‘[:upper:]’ ‘[:lower:]’ | uniq > words
- Получите уникальные слова из документа: cat document | tr ‘[:upper:]’ ‘[:lower:]’ | tr -d ‘,.:;()?!”‘ | tr “[:space:]” “\n” | sort | uniq > doc_words
- Найдите отсутствующие слова: comm -23 doc_words words
- Просмотрите результаты вручную и решите: добавить слово в пользовательский словарь или исправить.
Роль‑ориентированные чек‑листы
Для технического автора:
- удалите спецразметку (code blocks, inline code) перед проверкой;
- используйте словарь с терминами проекта;
- храните пользовательский словарь рядом с репозиторием.
Для системного администратора:
- подготовьте централизованный словарь для команды: sort /usr/share/dict/words | tr ‘[:upper:]’ ‘[:lower:]’ | uniq > /usr/local/share/words.team
- применяйте регулярное обновление пользовательских словарей.
Для разработчика:
- интегрируйте aspell/hunspell в pre-commit hook: проверять изменённые файлы;
- игнорируйте автогенерируемые файлы и бины.
Краткая сравнительная шпаргалка (cheat sheet)
- Простая командная цепочка (полезна для быстрой проверки):
cat document | tr '[:upper:]' '[:lower:]' | tr -d '.,:;()?!"' | tr "[:space:]" "\n" | sort | uniq | comm -23 - /usr/share/dict/words- Быстро и удобно (с aspell):
aspell list < document | sort -u- Для сложных случаев (Markdown/HTML) — сначала очистка разметки, затем проверка.
Критерии приёмки
- Скрипт выдаёт список слов, отсутствующих в словаре.
- Алиасы и локальные словари учтены (если требуется).
- Для файла со сложной разметкой проведена предварительная очистка.
Когда лучше выбрать aspell/hunspell вместо «старой школы»
- Если важны подсказки и возможность добавить слово в пользовательский словарь интерактивно — используйте aspell/hunspell.
- Если нужен интегрированный подход в IDE или CI — hunspell чаще встречается в проектах, совместимых с LibreOffice/Firefox.
Важно: перед массовым использованием метода удостоверьтесь, что словарь соответствует языку и предметной области текста.
Краткая таблица соответствия команд и задач
- tr ‘[:upper:]’ ‘[:lower:]’ — нормализация регистра.
- tr -d ‘… ‘ — удаление нежелательных символов.
- tr “[:space:]” “\n” — разделение слов по строкам.
- sort | uniq — сортировка и удаление дублей.
- comm -23 — слова из первого файла, отсутствующие во втором.
Сравнение подходов (когда выбрать что)
- “Old school” (tr + sort + comm): хорошо для полностью автономного процесса без внешних зависимостей.
- aspell/hunspell: удобнее для интерактивной работы и языковой поддержки.
- grep -F -x -v -f: полезно, когда вы уже получили список слов и хотите быстро отфильтровать словарь.
1‑строчный глоссарий
- tr — утилита замены/удаления символов.
- sort — сортирует построчный ввод.
- uniq — удаляет соседние дубликаты (часто в связке с sort).
- comm — сравнивает два отсортированных файла построчно.
- aspell/hunspell — инструменты проверки орфографии, умеют подсказки и пользовательские словари.
Короткое объявление (announce, 100–200 слов)
В командной строке Unix можно проверять орфографию быстро и автономно, используя стандартные утилиты: tr, sort, uniq и comm. Метод полезен для серверных сред, CI и сценариев, где нет графического интерфейса. Для интерактивной работы или при необходимости подсказок лучше использовать aspell или hunspell. В статье показаны надёжные командные цепочки, варианты для разных форматов документа (plain text, Markdown) и рекомендации по созданию и поддержке командных словарей.
Итог / Резюме
- Метод «старой школы» остаётся полезным: он прост, не требует дополнительных пакетов и легко автоматизируется.
- Для интерактивной и контекстной проверки используйте aspell или hunspell.
- Подготовка словаря и очистка разметки — ключевые шаги для корректной проверки.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента