15.0 (Russian conspect)
Поговорим про регулярные выражения – они облегчают командный интерфейс – ситуацию, когда вам полуавтоматическим путем нужно обрабатывать текст.
Шаблон — это такой простой язык описания строки, в котором некоторые символы заменены на спец символы или управляющие.
Как работают шаблоны? У нас “нечто” определяется как строка.
Мы берем шаблон и пытаемся распознать какой части шаблона какая часть строки соответствует. Фактически мы разделяем наш шаблон на атомарные подшаблоны.
А почему мы не можем попросить найти файлы название которых состоит только из цифр?
Потому что только из цифр и любого количества как бы объедены в “один флакон” то есть либо мы говорим любое кол-во любого, либо мы говорим диапазон, и оно одно.
Чем отличаются шаблоны от регулярных выражений? Тем что повторение символа или задавание диапазона размещены.
Главной и часто используемой утилитой командной строки является grep.
Есть повторители – они бывают двух видов: это любое кол-во символов от нуля.
Символ * заменяется на произвольное кол-во любых букв. Вопросительный знак ? меняется на ровно 1 букву и диапазон записанный в [] это ровно одна буква из диапазона.
Есть также позиционирование: есть ^ что обозначает начало строки.
Также существует принцип однозначности – каждый раз мы сопоставляем атомарные регулярны выражения со строкой то мы пытается “съесть” как можно больше – так называемы жадные повторения.
Самый левый – самый длинный: по сути, мы находим match и идем к следующему пока не настанет успех, если успех не настаёт, то мы уменьшаем длину предыдущей строки до тех пор, пока у нас не произойдёт match или урезать уже ничего нельзя.
Другая утилита — это редактор vim – в нем вы можете указать команду search.
Также есть команда sed который является потоковым редактором. Практически vim воспроизводит работу sed.
Помним, что символ * он хитрый так как под него подходит и пустая строка.
Иногда регулярные выражения легче писать чем читать – попробуйте прочитать такое:
sed ‘s/1\([0-9]\)/I\1/g’ < filename
Диапазон может быть не диапазон а просто перечислением: “[1-3]” тоже самое что “123”
Также существует “не входить в диапазон” – пример “[^QET]”
Если использовать sed -E то мы получаем расширенные регулярные выражения в которых можно задать сколько символ может повторятся.
Хорошим тоном считается использовать ‘[:digit:]’ вместо ‘[0-9]’. Это является примеров классом эквивалентности.
Есть следующие классы эквивалентности:
alnum, digit, punct, alpha, graph, space, blank, lower, upper, cntrl, print, xdigit.