Я прохожу курс "Операционная система Unix" и после тестов, вижу в отчете, что этот тест сдало еще 25 человек. Почему так мало, это ведь реально хороший и полезный урок. Здесь естьи теория и практичесские материалы. Сам курс написан хорошо, живым языком. И здесь я получил ответы на вопросы по Linux, которые боялся спросить. Наверное это из-за того, что в названии курса написано не Linux, а Unix и это многих отпугивает. |
Регулярные выражения
Текст
Одним из следствий У (точнее, правила human readable) в UNIX стало то, что все без исключения настройки системы и дополнительных служб, а также подавляющее большинство системных журналов и прочих хранилищ системной информации имеют текстовый формат. Это настолько бросается в глаза, что, наряду с интерфейсом командной строки, входит в понятие unix style. Даже если некоторые данные не содержатся в текстовом виде явно, всегда есть утилиты, выдающие их пользователю на терминал как текст.
Формально текстовый файл - это файл, разбитый на строки и слова, содержащий только печатные символы и символы конца строки. Таковы, как сказано в лекции 8, требования терминальной линии к передаваемой по ней информации: во-первых, некоторые символы (ascii-код которых меньше 32) считаются управляющими, во-вторых, поток байтов делится на строки при помощи символа конца строки (специальное обозначение - " \n ", ascii-код 12), в обработанном режиме именно строками система обменивается с пользователем, в-третьих, строка делится на слова с помощью символов- разделителей - пробелов и табуляций. По таким же правилам shell обрабатывает командную строку, однако разбиение на слова слегка усложняется из-за закавычивания. В языках программирования могут быть еще более сложные правила разбиения строк на слова: например, могут различаться идентификаторы, ключевые слова и знаки операций; разделитель между словами разного типа может быть необязательным и т. д.
Вообще, каждый тип текстового файла имеет свои представления о лексике (правилах построения слов ), синтаксисе (правилах сочетания слов ), семантике (правилах интерпретации текста). Представления эти, будучи формализованными, называются языком и задаются прикладной областью, а реализуются программой, которая будет разбирать содержимое файла. Неформальное требование к текстовому файлу - чтобы он был понятен, или, согласно И, потенциально понятен человеку. Для этого все слова, встречающиеся в файле, должны обозначать объекты, действия или отношения в прикладной области, а лексика, синтаксис и семантика образующегося языка должны быть понятны человеку. Собрав воедино все тексты, задающие решение пользовательской задачи и все нетекстовые исходные данные, мы получим главный элемент проективной системы - проект. Так, проект программного продукта - это исходные тексты программы на языке программирования и, возможно, данные, не влияющие на работу программы, - картинки, звуки и т. п.
В отличие от текста на естественном языке (например, на русском), тексты, составляющие различные проекты в UNIX, строго структурированы. Языки этих текстов имеют четкий синтаксис и довольно простую лексическую организацию. Если перед человеком стоит задача исправления проекта, для решения которой достаточно видоизменить имеющийся текст, а дописывать новые части проекта не надо, ее можно решать двумя способами: либо выбрасывать устаревшие куски и вписывать новые (что равносильно дописыванию), либо поручить эту работу роботу. Робот должен - на уровне, достаточном для данной работы, - разбираться в синтаксисе и лексике языка и иметь четкие инструкции, какие куски считать устаревшими и как их преобразовывать в новые.
Обработка текста
Иными словами, стандартная задача обработки текста состоит из поиска фрагмента текста заданной структуры и преобразования этого фрагмента согласно заданному алгоритму. Таким способом изменять проект зачастую гораздо быстрее и уж точно не в пример интереснее, чем механически выполнять работу, которую может сделать робот. Типичный пример выполнимой задачи - поиск определенного слова в заданном окружении и замена его на другое слово.
С задачей поиска помогает справиться мощный механизм представления структуры текста, называемый регулярным выражением (regular expression). Регулярное выражение - это строка, содержащая специальные символы, интерпретация которых такова, что одному регулярному выражению может соответствовать целый класс строк определенной структуры. С точки зрения области применения регулярное выражение напоминает шаблон, используемый в shell, однако возможностей у него намного больше. Термин "регулярное выражение" восходит к теории формальных языков и классификации формальных грамматик по Хомскому. Более чем подробный рассказ об этой теории, а также о методах синтаксического анализа см. в [ 24 ] .
Лексический анализ большинства языков в UNIX и большая часть синтаксического анализа делается именно на основе регулярных выражений. Поэтому инструмент анализа и преобразования текста, работающий с регулярными выражениями, во многих случаях может разобраться с упрощенным для решения частной задачи синтаксисом языка. Стоит заметить, что большинство языков UNIX различают строчные и прописные буквы, поэтому в регулярном выражении они также не смешиваются.
Про регулярные выражения написано несколько приличных руководств (re_format(7) или regex(7), regexp(3), grep(1)) и книг (настоятельно рекомендуем [ 26 ] ), так что все сказанное нами далее - попытка прояснить идею и очертить возможности регулярного выражения. В поисках более глубоких знаний рекомендуем обращаться к этим руководствам и в особенности к книге.