Искусство программирования для Unix
Искусство программирования для Unix читать книгу онлайн
Книги, подобные этой, редко появляются на прилавках магазинов, поскольку за ними стоит многолетний опыт работы их авторов. Здесь описывается хороший стиль Unix-программирования, многообразие доступных языков программирования, их преимущества и недостатки, различные IPC-методики и инструменты разработки. Автор анализирует философию Unix, культуру и основные традиции сформированного вокруг нее сообщества. В книге объясняются наилучшие практические приемы проектирования и разработки программ в Unix. Вместе с тем описанные в книге модели и принципы будут во многом полезны и Windows-разработчикам. Особо рассматриваются стили пользовательских интерфейсов Unix-программ и инструменты для их разработки. Отдельная глава посвящена описанию принципов и инструментов для создания хорошей документации. Книга будет полезной для широкой категории пользователей ПК и программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Регулярные выражения описывают шаблоны, которые могут либо совпадать, либо не совпадать со строками. Простейшим средством для работы с регулярными выражениями является утилита grep(1), фильтр, который переправляет со стандартного ввода на стандартный вывод каждую строку, соответствующую указанному регулярному выражению. Форма записи регулярных выражений кратко представлена в таблице 8.1.
Существует большое количество второстепенных вариантов записи регулярных выражений.
1. Выражения-маски. Ограниченный набор соглашений по применению символов-шаблонов (wildcard), использовавшийся в ранних оболочках Unix для сопоставления имен файлов. Существует всего 3 символа-шаблона: * — соответствует любой последовательности символов (как . * в других вариантах); ? — соответствует любому единичному символу (как . в других вариантах); [. . . ] — соответствует классу символов как в других вариантах. В некоторых оболочках (csh, bash, zsh) позднее был добавлен шаблон {} для выбора подстроки. Таким образом, выражение x{a,b}c соответствует строкам хас или xbc, но не хс. В некоторых оболочках выражения-маски получили дальнейшее развитие в направлении расширения регулярных выражений.
2. Базовые регулярные выражения. Форма записи, принятая в исходной утилите grep(1) для извлечения из файла строк, соответствующих заданному регулярному выражению. Выражения этого типа также применяются в строковом редакторе ed(1) и потоковом редакторе sed(1). Профессионалы старой школы Unix считают данное выражение основной, или "унифицированной", разновидностью регулярных выражений. Пользователи, впервые столкнувшиеся с более современными инструментами, склонны использовать расширенную форму, которая описана ниже.
3. Расширенные регулярные выражения. Запись, принятая в расширенной версии grep, egrep(1) для извлечения из файла строк, соответствующих заданному регулярному выражению. Регулярные выражения в Lex и редакторе Emacs весьма близки к egrep-разновидности.
Таблица 8.1. Примеры регулярных выражений
Регулярное выражение
Соответствующая строка
"х.у"
x, за которым следует любой символ с последующим у
"х.у"
х, за которым следует точка с последующим у
"xz?y"
х, за которым следует не более одного символа z с последующим у, т.е. "ху" или "xzy", но не "xz" или "xdy"
"xz*y"
х, за которым следует любое количество символов z, за которыми сле-дуету,т.е. "ху" или "xzy" или "xzzzy",HOне "xz" или "xdy"
"xz+y"
X за которым следует один или несколько экземпляров символа z, за которыми следует у, т.е. "xzy" или "xzzy",HOHe "ху", "xz" или "xdy"
"stxyz]t"
s, за которым следует любой из символов х, у или z, за которым следует t, т.е. "sxt", "syt" или "szt",HOHe "st" или "sat"
"a[x0-9]b"
а, за которым следует либо х, либо символ в диапазоне 0 - 9, за которым следует Ь, то есть, "axb", "аОЪ" или "а4Ь",ноне "ab" или "aab"
»s[
A
xyz] t"
s, за которым следует любой символ, кроме х, у или z, за которым следует t, т.е. "sdt" или "set", но не "sxt", "syt" или "szt"
"S [
A
x0-9] t"
s, за которым следует любой символ, кроме х или символа в диапазоне 0 - 9, за которым следует t, т.е. "sit" или " smt", но не " sxt", " s 01" или "s4t"
х в начале строки, т.е. "xzy" или "хггу",ноне "yzy" или "уху"
"x$"
х в конце строки, т.е. "yzx" или "ух", но не "yxz" или " zxy"
4. Регулярные выражения языка Perl. Форма записи, принятая в regexp-функциях языков Perl и Python. Выражения этого типа являются более мощными по сравнению с egrep-вариантом.
После рассмотрения основных примеров в таблице 8.2 приведена сводка стандартных шаблонов для регулярных выражений. Следует отметить, что в таблицу не включен вариант выражений-масок, поэтому запись "для всех" означает только Зтипа: базовый, расширенный/Emacs и Perl/Python.
Стандарт POSIX для регулярных выражений вводит некоторые символьные диапазоны, такие как [[ilower;; ] ] и [ [ :digit: ] ]. Кроме того, отдельные специфические средства используют дополнительные символы-шаблоны, не описанные здесь. Однако для интерпретации большинства регулярных выражений приведенных примеров достаточно.
Таблица 8.2. Введение в операции с регулярными выражениями
Символ-шаблон
Поддерживается
Соответствующая строка
во всех
Начало евсаре-последовательности. Определяет, следует ли интерпретировать последующий знак как шаблон. Последующие буквы или цифры интерпретируются различными способами в зависимости от программы
во всех
Любой символ
во всех
Начало строки
$
во всех
Конец строки
[...]
во всех
Любой из символов, указанных в скобках
Г.. ■]
во всех
Любые символы,
кроме указанных
в скобках
*
во всех
Любое количество экземпляров предыдущего элемента
?
egrep/Emacs, Perl/Python
Ни одного или один экземпляр предыдущего элемента
+
egrep/Emacs, Perl/Python
Один или несколько экземпляров предыдущего элемента
{п}
egrep,
В точности п повторений предыдущего элемента. Не поддерживается некоторыми старыми regexp-средствами
Perl/Python; как {n} в Emacs
{п,}
egrep,
п или более повторений предыдущего элемента. Не поддерживается некоторыми старыми regexp-средствами
Perl/Python; как {n, } в Emacs
{ш,п}
egrep,
Минимум ш и максимум п повторений предыдущего элемента. Не поддерживается некоторыми старыми regexp-средствами
Perl/Python; как {m,n} в Emacs
1
egrep,
Элемент слева или справа. Обычно используется с некоторой формой группирующих разделителей
Perl/Python; как | в Emacs
