Главная страница

ЛАБОРАТОРНЫЕ РАБОТЫ ОС (Для допуска необходимо сделать 1 или 6 л. Практикум по дисциплине Операционные системы (ОС). Цели лабораторных занятий это формирование у будущих бакалавров направлений подготовки 09. 03. 01


Скачать 2.71 Mb.
НазваниеПрактикум по дисциплине Операционные системы (ОС). Цели лабораторных занятий это формирование у будущих бакалавров направлений подготовки 09. 03. 01
Дата15.10.2022
Размер2.71 Mb.
Формат файлаpdf
Имя файлаЛАБОРАТОРНЫЕ РАБОТЫ ОС (Для допуска необходимо сделать 1 или 6 л.pdf
ТипПрактикум
#735270
страница17 из 21
1   ...   13   14   15   16   17   18   19   20   21
фильтр для текста.
В Linux регулярные выражения используются командой grep, которая позволяет искать файлы с определенным содержанием либо выделять из файлов строки с необходимым содержимым (например, номера телефонов, даты и т. д.). Многие программы, так или иначе работающие с текстом, (текстовые редакторы), поддерживают регулярные
выражения. К таким программам относятся два "главных" текстовых редактора Linux - Vim и Emacs. Однако нужно учитывать, что в разных программах используются разные диалекты языка регулярных выражений, где одни и те же понятия имеют разные обозначения, поэтому всегда нужно обращаться к руководству по конкретной программе.
1.5.1 Элементарные регулярные выражения
Элементарная структурная единица регулярного выражения — это символ. Текст можно искать по определенному набору букв и цифр.
Рассмотрим пример, в котором с помощью регулярного выражения выделим из данных строк те, которые содержат сочетание букв bc (именно в этом порядке):
Исходный набор строк: abc abcd dcba adbc
Регулярное выражение: bc
Результат: abc abcd

162 adbc
1.5.2 Конструкция вида [...]
Рассмотрим другой пример, заменив некоторые буквы в строках на заглавные:
Исходный набор строк: аbС abcd dcba adBc
Регулярное выражение: bc
Результат: abcd
Результат обработки строк с помощью регулярного выражения изменился. При использовании вышеуказанного регулярного выражения в большинстве случаев чаще всего различают строчные и прописные буквы, что логически обосновано, если не указан соответствующий параметр, предписывающий не различать их. Программы, которые работают с регулярными выражениями чаще всего различают строчные и прописные буквы, если не указана соответствующая опция, предписывающая не различать строчные и прописные буквы.
В результате получается всего одна строка — вторая. Для вывода трех строк, как в первом примере, понадобится особая конструкция.
Рассмотрим ее.
В основе данной конструкции лежат две квадратные скобки
(открывающая и закрывающая), внутри которых расположены символы либо конструкции (последний случай будет описан далее), один из которых может быть на месте этой конструкции в итоговом выражении.
Изменим регулярное выражение в предыдущем примере. Теперь задачей является сделать это регулярное выражение более универсальным, чтобы с его помощью можно было найти в исходном наборе строк сочетание bc независимо от того, в каком регистре находятся буквы в конечных выражениях.
Исходный набор строк: аbС abcd dcba adBc
Регулярное выражение:
[Вb][Сc]
Результат: аbС abcd

163 adBc
Теперь рассмотрим такой пример: с помощью регулярного выражения необходимо выделить из указанных в предыдущем примере строк те, которые содержат некоторую букву английского алфавита в нижнем регистре и сразу за ней — букву с в нижнем или верхнем регистре.
При применении способа перечисления для решения поставленной задачи получится следующее регулярное выражение:
[abcdefghijklmnopqrstuvwxyz] [Cc]
Это верно, но строка получилась длинной, что особенно неудобно при составлении больших регулярных выражений. В подобных случаях можно перечислить все эти 26 символов короче, используя интервалы, то есть указать начальный и конечный символы, поставив между ними знак
«тире». Рассмотрим пример:
Исходный набор строк: аbС abcd dcba adBc
Регулярное выражение:
[a-z][Cc]
Результат: аbС abcd dcba
Здесь a-z — это и есть нужный интервал. Можно изменить пример так, чтобы первый символ мог быть как строчным, так и прописным, для чего сразу после первого интервала указываем второй:
Исходный набор строк: аbС abcd dcba adBc
Регулярное выражение:
[a-zA-Z][Cc]
Результат: аbС abcd dcba adBc
То же касается и цифр. Границами интервала могут быть любые символы, но последовательности типа [z-a] и [5-1] смысла иметь не будут, так как ASCII-код первого символа должен быть меньше либо равен коду

164 завершающего. По поводу интервалов с цифрами следует напомнить, что символ нуля идет раньше символов всех остальных цифр. Количество стоящих рядом последовательностей неограниченно.
В этой же конструкции можно обратить (или, как еще говорят, инвертировать) выбор символов, поставив после знака открывающей квадратной скобки символ ^, после чего на месте конструкции будут предполагаться все символы, кроме указанных в ней самой. Рассмотрим это на предыдущем примере.
Из данного набора строк выделим только те, в которых буква b стоит перед любым символом, кроме буквы с.
Исходный набор строк:
аbС abcd dcba adBc
Регулярное выражение:
[Bb][^Cс]
Результат: dcba
1.5.3 Метасимволы
Не все символы можно использовать прямо по назначению.
Посмотрите, например, на конструкцию, которая описывалась в предыдущем разделе. Допустим, требуется найти в каком-то файле строки, содержащие следующий набор символов: abc[def. Можно предположить, что регулярное выражение будет составлено по принципам, описанным выше, но это неверно. Открывающая квадратная скобка — это один из символов, который несет для программы, работающей с регулярными выражениями, особый смысл (который был рассмотрен ранее). Такие символы называются метасимволами.
Метасимволы бывают разными и служат для различных целей. Из предыдущего материала можно выделить метасимволы открывающей и закрывающей квадратных скобок, а также символ ^. Символ «тире» не рассматривается как метасимвол, так как он имеет особое значение только внутри конструкции с квадратными скобками, а вне такой конструкции специально не применяется.
Рассмотрим те метасимволы, которые предполагают, что в конечном выражении на их месте будет стоять какой-либо символ или символы
(табл. 1).

165
Таблица 1.
Знакозаменяющие метасимволы
Метасим
-вол
Описание метасимвола
.(точка)
Предполагает, что в конечном выражении на ее месте будет стоять любой символ. Продемонстрируем это на примере набора английских слов:
Исходный набор строк: wake make machine cake maze
Регулярное выражение: ma.e
Результат: make maze
\w
Замещает любые символы, которые относятся к буквам, цифрам и знаку подчеркивания. Пример:
Исходный набор строк: abc а$с a1c а с
Регулярное выражение:
a\wc
Результат:
abc a1c
\W
Замещает все символы, кроме букв, цифр и знака подчеркивания (то есть является обратным метасимволу \w). Пример:
Исходный набор строк: abc а$с a1c а с
Регулярное выражение:
a\Wc
Результат:
а$с а с

166
Метасим
-вол
Описание метасимвола
\d
Замещает все цифры. Продемонстрируем его действие на том же примере:
Исходный набор строк:
abc а$с a1c а с
Регулярное выражение:
a\dc
Результат:
alc
\D
Замещает все символы, кроме цифр, например:
Исходный набор строк: abc а$с alc а с
\D
Регулярное выражение: a\Dc
Результат: abc а$с а с
[\b]
Замещает символ перевода курсора на один влево (возврат курсора)
\r
Замещает символ перевода курсора в начало строки
\n
Замещает символ переноса курсора на новую строку
\t
Замещает символ горизонтальной табуляции
\v
Замещает символ вертикальной табуляции
\f
Замещает символ перехода на новую страницу
\s
Равнозначен использованию пяти последних метасимволов, то есть вместо метасимвола \s можно написать [\r\n\t\v\f ], что, однако, не так удобно
\S
Является обратным метасимволу \ s
Для лучшего понимания рассмотрим, что такое символ перевода курсора в начало строки, переноса курсора на новую строку и т. д. В конце каждой строки находятся один или два символа, которые указывают на необходимость перехода на новую строку. Начиная с операционной системы MS-DOS и до настоящего времени в операционных системах
Microsoft используются два символа для обозначения переноса строки — сам символ переноса и символ возврата курсора в начало строки

167
(заменяются метасимволами \n и \r соответственно), хотя в отдельности эти символы почти не применяются. В Linux используется только символ перехода на новую строку (заменяется метасимволом \n). Это следует учесть при составлении регулярных выражений.
Рассмотрим интересную группу символов, для чего поставим следующую задачу. Количество символов, которые должны быть в конечном тексте, не всегда известно (примером может быть распознавание имени веб-сайта), поэтому при помощи вышеописанных конструкций и метасимволов написать действительно универсальные регулярные выражения невозможно. Рассмотрим еще одну группу символов, которые помогут решить подобные проблемы. Они используются сразу после символа, метасимвола либо конструкции, количество вхождения которых они должны описать (табл. 2).
Таблица 2.
Метасимволы количества повторений
Симво л
Описание метасимвола
?
Указывает обработчику регулярных выражений на то, что предыдущий символ, метасимвол или конструкция могут вообще не существовать в конечном тексте либо присутствовать, но иметь не более одного вхождения. Рассмотрим пример. Из данного набора строк требуется найти только те, в которых символу с может (но не обязательно) предшествовать один символ а,перед чем должен стоять символ b:
Исходный набор строк: acbd aabc caab ecad bcde abac
Регулярное выражение: b[Aa]?c
Результат: aabc bcde abac
*
Означает, что впереди стоящие символ, метасимвол либо конструкция могут как отсутствовать, так и быть в конечном выражении, причем количество вхождений неограниченно. Пример: из данного набора строк выделим те, в которых есть по крайней мере две буквы а, между которыми может быть либо отсутствовать некоторое количество цифр:
Исходный набор строк:
а123а

168
Симво л
Описание метасимвола а12а al23b alc3b b12а aaa
Регулярное выражение:
[Aa]\d*[Aa]
Результат:
al23a al2a aaa
+
Действие схоже с действием предыдущего символа с тем отличием, что впередистоящие метасимвол, символ или конструкция должны повторяться как минимум один раз. Рассмотрим предыдущий пример, но чтобы между буквами абыла хотя бы одна цифра:
Исходный набор строк: а123а а12а al23b alc3b b12а aaa
Регулярное выражение:
[Аа]\d+[Aa]
Результат:
а123а а12а
{min, max}
Иногда первых трех способов указания количества вхождений бывает недостаточно, так как они описывают количество не детально. Решить проблему можно следующим способом. Для указания количества вхождений символа либо конструкции после них ставят открывающие фигурные скобки и пишут минимальное количество вхождений. Если это количество фиксированное (то есть должно быть не больше и не меньше вхождений символа), то скобку закрывают; если должно быть не меньше указанного количества вхождений, то ставят запятую и закрывают скобку; если существует предельное количество вхождений, то после запятой указывают его и закрывают скобку. Так, эквивалентом знаку вопроса является конструкция {0,1}, знаку звездочки — { 0, }, знаку «плюс» — {1, }. Рассмотрим пример:
Исходный набор строк: а123а а12а al23b alc3b b12а aaa
Регулярное выражение:

169
Симво л
Описание метасимвола
[Aa]\d{2,}[Аа]
Результат:
а123а а12а
Символ \b
Описание метасимвола:
Играет большую роль при разборе выражений. Его функция заключается в следующем. Обычно программы, которые работают с регулярными выражениями (в том числе и grep), ищут сходные выражения в тексте, не определяя, является ли выражение словом и может ли быть расположено конечное выражение в начале или конце слова. Однако часто требуется найти именно конкретное слово, что позволяет сделать данный метасимвол. Он ставится на том месте, где слово должно начинаться или заканчиваться. Рассмотрим пример, в котором попытаемся в данном наборе слов найти начинающиеся на букву s и заканчивающиеся на букву r
(для сравнения здесь будут приведены примеры регулярного выражения с использованием метасимвола /b и без него):
Исходный набор строк: starfish starless stellar ascender sacrifice scalar
Регулярное выражение:
[Ss]\w*[Rr]
Результат:
starfish
starless
stellar ascender
sacrifice
scalar
Были выбраны слова, которые не соответствуют условиям. Изменим регулярное выражение, добавив метасимвол \b:
Регулярное выражение:
\b[Ss]\w*[Rr]\b
Результат: stellar scalar

170
1.5.4 Группировка выражений
Особым приемом при составлении регулярных выражений является группировка нескольких его составляющих в одну единицу. Рассмотрим пример, в котором требуется выделить из текста обычный телефонный номер в его записи без кода города, когда весь номер разбивается на три части, между которыми ставится дефис. Для этого подойдет такое регулярное выражение:
\d{l,3}-\d{l,3}-\d{l,3}
Это регулярное выражение можно сократить. В нем есть два идентичных блока текста, стоящих подряд. В этом случае всегда можно сделать выражение короче, заключив повторяющиеся фрагменты в круглые скобки и указав после них количество повторений. Это можно сделать любым способом. Вот один из вариантов:
(\d{1,3}-){2}\d{l,3}
Теперь все выражение, заключенное в скобки, считается единым целым.
Внутри скобок также можно использовать прием, который позволяет выбирать между несколькими выражениями. Вот простой пример. Дано несколько чисел. Необходимо с помощью регулярного выражения выделить из них те, в которых есть цифра 7, после которой находится одна из цифр — 1, 3 или 5. Задачу легко решить с помощью конструкции с квадратными скобками, однако сделаем по-другому. Для выбора между несколькими выражениями требуется заключить их в круглые скобки и поставить между каждыми двумя выражениями символ вертикальной черты. Посмотрим, как таким способом решить поставленную задачу.
Исходный набор строк:
123 178 176 755 713 873
Регулярное выражение:
(7(1|3|5))
Результат:
755 713 873
Данную задачу было бы правильнее решить с помощью конструкции с квадратными скобками, при использовании которой регулярное выражение получилось бы короче. Следует отметить, что в скобках можно также выполнять операцию группировки выражений неограниченное по

171 глубине количество раз, то есть выражение типа (а | (b | (с | d))) будет верным.
1.5.5 Использование зарезервированных символов
Выше упоминалось, что некоторые символы имеют для программы, работающей с регулярными выражениями, особый смысл. Это, например, косая черта, точка, круглая, фигурная и квадратная скобки, звездочка и т. д. Однако не исключено, что в целевом выражении также могут быть эти символы, и их наличие нужно будет определить в регулярном. В данном случае эти символы нужно указать особым образом («защитить» их). При этом перед нужным символом ставят косую черту, то есть, чтобы указать наличие в конечном тексте символа звездочки, в регулярном выражении на соответствующем месте следует написать \*. Рассмотрим пример.
С помощью регулярного выражения требуется найти строки, где между некоторыми буквами или цифрами в круглые или квадратные скобки заключено несколько цифр.
Исходный набор строк: ab(123)cd a[12]d al23]d a(12d l[123]d
Регулярное выражение:
\w+(\[ |\()\d+(\] |\) )\w+
Результат: ab(123)cd a[12]d
1[123]d
Это регулярное выражение несколько нелогично, так как позволяет сделать открывающей круглую скобку, а закрывающей — квадратную, и наоборот. Попробуйте придумать свое, более универсальное регулярное выражение, которое исправило бы этот недостаток.
1.5.6 Примеры использования регулярных выражений
Рассмотрим несколько примеров на основе изученного материала. В первом примере попытаемся из текста выделить IP-адреса. Следует напомнить, что правильным IP-адресом являются четыре числа, в каждом из которых содержится не более трех цифр, причем эти числа разделены точками. Регулярное выражение будет таким:
\d{l,3}\.\d{l,3}\.\d{l,3}\.\d{l,3}\
В нем содержится три одинаковых блока, стоящих один за другим. Их можно сгруппировать в один блок следующим образом:
(\d{l,3}\.){3}\d{l,3}

172
Однако это выражение также нельзя назвать верным: ни одно из чисел, входящих в состав IP-адреса, не может быть больше 255. По этой причине составить регулярные выражения не так просто. Следует разбирать каждое число посимвольно. Рассмотрим возможные варианты и регулярные выражения, соответствующие им (табл.3).
Таблица 3.
Перебор регулярных выражений для определения IP-адреса
Описание
Регулярное выражение
Один или два символа цифр. В таком случае эти цифры могут быть любыми
\d{l,2}
Три символа цифр, причем первая — нуль или единица.
В таком случае две другие цифры могут быть любыми
(0|l)\d{2)
Три символа цифр, причем первая двойка, а вторая меньше пяти. В таком случае третья цифра может быть любой
2[0-4]\d
Три символа цифр, причем вторая — пятерка.
Третья цифра должна быть меньше или равна пяти
25[0-5]
Осталось сгруппировать выражения, приведенные в таблице, в одно, которое позволило бы выделить из текста число, меньшее либо равное 255:
((\d{l,2})I{(0|l)\d{2}) | (2[0-4]\d) | (25[0-5]))
В итоге получаем регулярное выражение для поиска IP-адреса:
(((\d{1,2}) | ((0|1) \d{2}) | (2[0-4]\d) | (25[0-5]))\.) {3}
((\d{l,2}) | ((0|l)\d{2}) | (2[0-4]\d) | (25 [0-5]))
Продемонстрируем работу этого регулярного выражения на примере.
Пример:
Исходный набор строк:
127.0.0.1 255.255.255.255 12.34.56 123.256.0.0 1.23.099.255
Регулярное выражение:
((( \d{1,2}) | ((0 | l)\d{2}) | (2[0-4]\d) | (25 [0-5] ) ) \.) {3}\d{l,3}
1   ...   13   14   15   16   17   18   19   20   21


написать администратору сайта