Для тренировки работы с регулярными выражениями можно пройти туториал на сайте regexone.com — там есть и обучение, и практические задачки. Это не будет проверяться, но будет полезно для вас.
Для тех, кому хочется немного поломать голову, можно попробовать свои силы в регэкс-гольфе (разновидность "код-гольфа"): необходимо написать регулярное выражение, принимающие одни и отвергающее другие заранее заданные строки.
Для успешной сдачи этого задания нужно решить минимум четыре пункта из пяти.
Как и в прошлый раз решением является набор команд и их вывод. Если вывод отдельной команды не является значимым, но при этом занимает много места — смело вырезайте его (например, вывод wget). Решение отдельных пунктов, пожалуйста, отделяйте визуально (например, выполнив echo '============================================').
-
Скачайте с помощью
wget«Капитанскую дочку» в простом.txtформате: ftp://breeze.cypok.info/pub/ToMP/tasks/2/the_captains_daughter.txt.Необходимо подсчитать, сколько раз в ней встречается слово "дверь". Необходимо самостоятельно узнать, какие полезные опции есть у
grepи будет полезным познакомиться с утилитойwc. -
В той же «Капитанской дочке» необходимо подсчитать, сколько раз встречается слово "вина" (например, "… стакан вина и …"). Причем различные частичные совпадения (например, "винам" или "половина") учитывать не нужно.
-
И, наконец, необходимо подсчитать, сколько раз встречается фамилия "Пугачев" без учета частичных совпадений.
-
Создайте файл
block.txtс одним из самых известных стихотворений Александра Блока. Для этого можно воспользоваться командойcat, дав ей на вход в консоли текст стихотворения, а выход перенаправив в файл.$ cat > block.txt Ночь, улица, фонарь, аптека, Бессмысленный и тусклый свет. Живи еще хоть четверть века — Всё будет так. Исхода нет. Умрешь — начнешь опять сначала И повторится всё, как встарь: Ночь, ледяная рябь канала, Аптека, улица, фонарь.Теперь с помощью программы
sedадаптируйте это стихотворение для детей от 0 до 3 лет (утверждается, что до 5 лет дети не могут понять концепцию смерти): замените слово "Живи" на "Не спи" и "Умрешь" на "Уснешь", результат направьте в файлblock_kids_edition.txt. -
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)
