TerminalПришло время в очередной раз вернуться к циклу статей о командной строке Mac OS X. Сегодня мы расскажем об основах языка регулярных выражений и о том, как эти знания могут пригодиться при использовании команды find (равно как и ряда остальных команд). Кроме того, мы расскажем о команде grep, которая позволяет проводить «умную» фильтрацию результатов любой другой команды.

Если верить Википедии, то регулярные выражения (regular expressions, сокр. RegExpRegEx) — это формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов. Говоря человеческим языком — это использование всяческого рода масок для имён объектов или их содержимого.

Основа регулярных выражений — символы подстановки. Полагаем, они вам давно знакомы:

? заменяет один символ. Например, под маску ?Tunes подойдёт программа iTunes, но не подойдёт программа ooTunes.

* заменяет любое число символов. Например, a*t найдёт и трёхбуквенные, и тридцатибуквенные имена, начинающиеся с a и кончающиеся на t.

\ экранирует один следующий символ. Если помните, этой уловкой мы пользовались, чтобы напечатать в Терминале команды с пробелом. Если перед пробелом поставить обратный слэш, то пробел будет считаться именно пробелом, но не концом команды.

А теперь приступим к тому, что вам незнакомо.

^ означает начало строки. Например ^a означает выражение, начинающееся с a.

$ означает конец строки. b$ будет означать символ b в конце строки выражения.

\b означает границу слова. Обратите внимание: буква b тут входит в состав оператора. Если вам надо найти букву b на границе слов, то придётся вводить b\b.

\B означает «не конец слова». \Bw\B означает букву w, находящуюся в середине слова.

[] означает символьный класс. Всё, что между квадратными скобками — это допустимое содержимое класса. Например, вам нужно отфильтровать файлы File1, File2 и File3 от файлов File4, File5. Тогда в качестве маски можно ввести File[123].

Внутри символьного класса допустимо использование символа исключения — ^. Если написать File[^45], то результат фильтрации будет тем же, что и в предыдущем примере: из результатов будут исключены все файлы, у которых после File следует четвёрка или пятёрка.

{} — это квантификатор. Он указывает количество повторений символа. Если вписать Fil{5}e, то это будет означать поиск файла Fillllle. Можно вписать две цифры через запятую — это будет означать количество повторений ОТ первой цифры ДО второй. Если вписать {6,}, это будет означать «не менее 6 повторов», а если {,11} — то «не более 11».

Собственно, привычные вам  знаки ? и * — это принятые сокращения квантификаторов. Вместо {0,} употребляется звёздочка, вместо {0,1} — знак вопроса. Кстати, запомните ещё одно принятое сокращение: + обозначает квантификатор {1,}.

Если вы думаете, что это всё, то глубоко ошибаетесь. Мы не станем грузить вас такими областями знаний, как атомарная группировка или группировка без обратной связи. Пора заняться командой grep.

grep

Это мощный фильтр результатов. Как правило, команда grep применяется в связке с другими командами, выход которых она фильтрует.

Возьмём простой пример — у нас есть папка Files, в которой 50000 файлов, среди них есть 10 нужных нам — в их имени есть слово Table. Как вывести только их список, не загромождая экран всеми остальными? Очень просто — запустить команду ls, приклеив к ней фильтр.

ls Files

вывела бы нам все 50000 файлов. А вот

ls Files | grep Table

покажет нам только нужные.

Как видите, «склеивание» команд осуществляется через конвейер — символ | . Он означает, что выход первой команды сразу переадресуется второй.

Синтаксис у grep следующий:

grep [параметры] [маска фильтрации]

Параметров немало, они есть почти на каждую букву алфавита:

-a — воспринимает бинарные файлы как текст.

-B — показывает вам не только отфильтрованную строку, но и некоторое число (-B 5) предшествующих. Параметр пригодится при поиске внутри текста.

— то же самое, только указывается число строк после совпадения.

-e — принудительно заставляет воспринимать всё, что написано далее, как регулярное выражение

-E — то же самое, только Терминал станет интерпретировать расширенное регулярное выражение, поддерживающее значительно большее число сокращений.

-f — берёт маску из файла по указанному пути.

-H — для каждого совпадения выводится имя файла.

-i — игнорирует различия в регистре между объектами поиска и маской.

-m — ограничивает число результатов поиска (-m 20).

-n — нумерует каждую строку с результатами.

-o — показывать не всю совпадающую строку, а только отдельный фрагмент.

-s — отключает сообщения об ошибках.

-U — принудительно рассматривает файлы как бинарные.

-v — инвертирует маску фильтрации.

-Z — выводит результаты фильтрации сплошным массивом, без пробелов и переносов.

На этом знакомство с командой grep можно считать законченным. Помните про неё: она позволяет сделать общение с Терминалом намного удобнее.

В следующей статье мы поговорим об атрибутах объектов и их изменении.

Поделитесь страницей через социальные сети