Skip to content
This repository was archived by the owner on Oct 10, 2025. It is now read-only.

Latest commit

 

History

History
78 lines (52 loc) · 7.09 KB

File metadata and controls

78 lines (52 loc) · 7.09 KB

Задание №2

Очередная смешная картинка

Подготовительная часть

Для тренировки работы с регулярными выражениями можно пройти туториал на сайте regexone.com — там есть и обучение, и практические задачки. Это не будет проверяться, но будет полезно для вас.

Для тех, кому хочется немного поломать голову, можно попробовать свои силы в регэкс-гольфе (разновидность "код-гольфа"): необходимо написать регулярное выражение, принимающие одни и отвергающее другие заранее заданные строки.

Зачетная часть

Для успешной сдачи этого задания нужно решить минимум четыре пункта из пяти.

Как и в прошлый раз решением является набор команд и их вывод. Если вывод отдельной команды не является значимым, но при этом занимает много места — смело вырезайте его (например, вывод wget). Решение отдельных пунктов, пожалуйста, отделяйте визуально (например, выполнив echo '============================================').

  1. Скачайте с помощью wget «Капитанскую дочку» в простом .txt формате: ftp://breeze.cypok.info/pub/ToMP/tasks/2/the_captains_daughter.txt.

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

  2. В той же «Капитанской дочке» необходимо подсчитать, сколько раз встречается слово "вина" (например, "… стакан вина и …"). Причем различные частичные совпадения (например, "винам" или "половина") учитывать не нужно.

  3. И, наконец, необходимо подсчитать, сколько раз встречается фамилия "Пугачев" без учета частичных совпадений.

  4. Создайте файл block.txt с одним из самых известных стихотворений Александра Блока. Для этого можно воспользоваться командой cat, дав ей на вход в консоли текст стихотворения, а выход перенаправив в файл.

    $ cat > block.txt
    Ночь, улица, фонарь, аптека,
    Бессмысленный и тусклый свет.
    Живи еще хоть четверть века —
    Всё будет так. Исхода нет.
    
    Умрешь — начнешь опять сначала
    И повторится всё, как встарь:
    Ночь, ледяная рябь канала,
    Аптека, улица, фонарь.
    

    Теперь с помощью программы sed адаптируйте это стихотворение для детей от 0 до 3 лет (утверждается, что до 5 лет дети не могут понять концепцию смерти): замените слово "Живи" на "Не спи" и "Умрешь" на "Уснешь", результат направьте в файл block_kids_edition.txt.

  5. sed и регулярные выражения способны и на более замысловатые операции. Давайте посмотрим на команду, которая разворачивает все трехбуквенные слова:

    $ echo "abc one two three" | sed --regexp-extended 's/\b(.)(.)(.)\b/\3\2\1/g'
    cba eno owt three
    

    --regexp-extended (-r) — активация режима полноценных регулярных выражений, они нам понадобятся.

    Рассмотрим отдельно первую часть sed-команды, выражение для поиска: \b(.)(.)(.)\b. \b — условие границы слова, а внутри слова у нас три группы из одного произвольного символа — таким образом мы найдем все трехбуквенные слова и каждую букву сохраним в отдельную группу. Эти группы могут быть использованы в других частях sed-команды.

    В нашем случае мы используем их во второй части, выражении для замены: \3\2\1. \N — это обратная ссылка на группу номер N. Таким образом строка для замены будет состоять их трех ранее найденных групп: последняя буква, средняя буква и первая буква.

    Модификатор g в конце sed-команды означает глобальную замену, то есть обработку всех вхождений шаблона, а не только первого в строке.

    Интересным является то, что обратные ссылки могут быть также использованы и в выражении для поиска, например, для поиска всех слов из двух одинаковых слогов длины два:

    $ cat /usr/share/dict/words | grep -E '\b(..)\1\b'
    adad
    anan
    arar
    baba
    bibi
    bobo
    coco
    dada
    dodo
    eyey
    ...
    

    А теперь используйте полученные знания, чтобы переформатировать входной файл с ФИО и номерами студенческих (в формате CSV) в более человеко-читабельный вид:

    $ cat > students.txt
    Иванов Иван Иванович,230020
    Назарбаева Хаят,230010
    О Евгений Петрович,230040
    
    $ cat students.txt | ...
    Иван Иванов (230020)
    Хаят Назарбаева (230010)
    Евгений О (230040)