Macintosh & Education

Что такое BBEdit Grep, и с чем его едят

Grep - возможно одна из наиболее мощных и наименее известных возможностей BBEdit. Версия grep, реализованная в BBEdit, базовая, подобная команде UNIX'а egrep. Если Вы еще не знаете, как им пользоваться, обязательно научитесь -- это чрезвычайно полезно.


Содержание


Символы, используемые в шаблонах поиска

Вводимый символЧто обозначаетПримеры
Любой символ Тот же символ, за исключением спецсимволов, описанных ниже А обозначает А, Б обозначает Б и т.д.
.(точка) Любой символ (за исключением "конца строки") или c, или 3, space, etc.
# Любая цифралюбая из: 0, 1, 2, 3, 4, 5, 6, 7, 8 или 9
\d Любая цифралюбая из: 0, 1, 2, 3, 4, 5, 6, 7, 8 или 9 (как и #)
Заметьте: только в BBEdit Pro 5.1 и Lite 4.6 или новее
\D любая не-цифралюбой символ кроме 0, 1, 2, 3, 4, 5, 6, 7, 8 или 9 (обратно \d)
Заметьте: только в BBEdit Pro 5.1 и Lite 4.6 или новее
^ начало строки
 
$ конец строки
 
\t табуляция
 
\r line break (return)
 
\n новая строка соответствует новой строке в Unix (line feed)
\f новая страница (form feed)
 
\s пробельный символ любой пробельный символ (space, tab, line break, newline, form feed)
Заметьте: только в BBEdit Pro 5.1 и Lite 4.6 или новее
\S не-пробельный любой непробельный символ (все, кроме \s)
Заметьте: только в BBEdit Pro 5.1 и Lite 4.6 или новее
\w символ слова Символы слов (Word characters) буквы, цифры, подчеркивание и символы с кодами более 127.
Заметьте: только в BBEdit Pro 5.1 и Lite 4.6 или новее
\W не-словесный символ все символы, не входящие в \w
Заметьте: только в BBEdit Pro 5.1 и Lite 4.6 или новее
\character специальный символ \\ значит \ (обратный слеш), \. значит . (точка), и т.п.
[любой набор символов] любой из перечисленных символов[абв] обозначает или а, или б, или в
[символ-символ] любой символ из указанного диапазона [а-в] обозначает или а, или б, или в
[^любой набор символов] любой символ, за исключением перечисленных после ^ [^я3] обозначает любой символ, кроме я и 3

Представление повторяющихся символов в шаблонах поиска

Вводимый символЧто обозначаетПример
? предшествующий символ должен встретиться не более 1 раза ко?п соответствует "кп" или "коп", но не "кооп"
* предшествующий символ повторяется любое число раз либо вообще отсутствуетко*п соответствует "кп", "коп", "кооп", но не "корп"
+ предшествующий символ обязательно присутствует и может повторятьсяко+п соответствует "коп" и "кооп", но не "кп"
шаблон1|шаблон2 соответствует одному или другому шаблонуко|п соответствует либо "ко", либо "п" (в "коп" сперва будет найдено "ко", при повторном поиске -- "п")
(шаблон)любой из спецсимволов как описано выше, но вместо символа рассматривается группа в скобках(ко)*п соответствует "п", "коп", "кокоп", но не "кп"

Сохранение элементов шаблонов при замене

Вводимый символЧто обозначаетПример
(шаблон) сохранить символы, соответствующие шаблону, для использования при замене, в порядке нахождения. Первый шаблон сохраняется в \1, второй -- в \2 и т.д. Затем эти символы можно будет использовать при замене. а(б.к) будет сохранять символы, соответствующие "б.к" в \1, так что если найден "бык", а в строке замены использовано "\1", в соответствующее место будет вставлено именно слово "бык".

Символы для шаблонов замены

Вводимый символЧто обозначаетПример
& найденное при поиске соответствие шаблонуесли искали a@b.c, и BBEdit нашел "a@bjc", то в строке замены & будет обозначать именно "a@bjc"
\цифра сохраненный шаблон. BBEdit нумерует найденные шаблоны от \1 до \9, затем \0 если искали (a@b.)c, и было найдено "a@boc", то \1 будет обозначать фрагмент "a@bo"
\символ символ, нормально являющийся специальным символом \\ обозначает \ (обратный слеш), \& обозначает & (амперсанд) и т.п..

Специальные символы должны предваряться \
В строках поиска это: .#^$\?+*|[]()
Внутри [] также нужно предварять \ знак (-)
В шаблонах замены требуется отмечать только: &\.

Примеры шаблонов

Вот несколько примеров, которые могут оказаться полезными, а также показать способы использования шаблонов поиска.

Search: <(/?)B>
Replace: <\1STRONG>

Такие шаблоны позволяют сразу поменять и начальные, и конечные теги "B" на "STRONG". Аналогично можно работать с любыми тегами, не имеющими атрибутов.

Не так все просто, если нужно заменить, например, тег BIG на FONT SIZE="+1". Можно менять начальные и конечные теги по отдельности. Но, использование grep, позволяет сделать все сразу.

Если в вашем тексте открывающий и закрывающий теги BIG всегда находятся на одной строке и не повторяются в одной строке по нескольку раз, используйте следующее:

Search: <BIG>(.*)</BIG>
Replace: <FONT SIZE="+1">\1</FONT>

Но здесь есть существенные недостатки. Во-первых, . не будет совпадать с символом конца строки, поэтому не будутзаменяться теги, разнесенные на разные строки. Во-вторых, grep в BBEdit "жадный", т.е. захватывает самый большой фрагмент, соответствующий шаблону. Поэтому строка, подобная следующей:

<BIG>test</BIG> another <BIG>test</BIG>

будет преобразована в:

<FONT SIZE="+1">test</BIG> another <BIG>test</FONT>

Как же быть? Можно сделать так:

Search: <BIG>([^<]*)<BIG>
Replace: <FONT SIZE="+1">\1</FONT>

[^<]* соответствует любому числу любых символов, за исключением <, так что фрагмент будет закончен первым встретившимся символом < . Это по-прежнему не сработает, если внутри BIG встречаются другие теги, но все же лучше предыдущего примера.

Еще один пример: как удалить ведущие пробелы из каждой строки.

Search: ^[ \t]+
Replace:

Такие шаблоны определяют, что нужно найти любой набор пробелов и/или символов табуляции в начале строки и заменить его на "ничего". В этот раз очень хорошо, что BBEdit -- "жадный". Если бы он останавливался на первом встреченном пробеле, при каждом запуске удалялся бы только один лишний символ, и операцию пришлось бы повторять многократно. А так получается, что удаляются сразу все ненужные пробелы. Вот другой способ осуществить такую операцию:

Search: ^[ \t]+([^ \t])
Replace: \1

В этом случае находится фрагмент, состоящий из любого числа пробелов/табуляций и первого непробельного символа, после чего весь фрагмент заменяется на последний свой символ. Такая запись не имеет никаких преимуществ перед приведенной ранее. Это -- просто пример возможных шаблонов.

Еще одна часто встречающаяся проблема -- замена более одного пробела на табуляцию (например, при преобразовании таблицы, набранной с помощью пробелов, для базы данных или программы верстки). Нужные шаблоны можно записать по аналогии с уже описанными примерами. Для большей ясности пробел будем обозначать как \s.

Search: \s\s+
Replace: \t

Компьютер должен будет находить пробел, после которого стоят еще один или несколько пробелов. Другой способ записать это:

Search: \s\s+([^\s])
Replace: \t\1

В данном случае второй способ не дает выигрыша, но иногда шаблон, составленный подобным образом, может выручить при более сложных ограничителях.

"Хитрости" Grep

Чтобы съэкономить время, пользуйтесь возможностью сохранить шаблон поиска ("add this pattern..."). Лучше сохранять "обобщенные" варианты, например, Search: <(/?)TAG1> Replace: <\1TAG2> вместо B и STRONG из примера.

Удалить лишние шаблоны всегда можно в разделе Grep Patterns параметров (Preferences) программы. Не храните шаблоны ставшие ненужными, чем их меньше, тем быстрее происходит выбор из меню.

Для выполнения более сложных операций поиска замены BBEdit Pro позволяет использовать фильтры на Перл (Perl Filters), а также использовать AppleScript.

Проблемы с шаблонами Grep

Если ваши шаблоны работают не так, как Вы ожидали, возможны следующие причины:


Данный текст основан на статье Cari D. Burstein, размещенной на www.anybrowser.org


[Макинтош] [Титульная страница] [Send Mail to Me]

Made with Macintosh