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
В данном случае второй способ не дает выигрыша, но иногда шаблон, составленный подобным образом, может выручить при более сложных ограничителях.
Чтобы съэкономить время, пользуйтесь возможностью сохранить шаблон поиска ("add this pattern...").
Лучше сохранять "обобщенные" варианты, например, Search: <(/?)TAG1> Replace: <\1TAG2> вместо B и STRONG из примера.
Удалить лишние шаблоны всегда можно в разделе Grep Patterns параметров (Preferences) программы.
Не храните шаблоны ставшие ненужными, чем их меньше, тем быстрее происходит выбор из меню.
Для выполнения более сложных операций поиска замены BBEdit Pro позволяет использовать фильтры на Перл (Perl Filters), а также работать с AppleScript.
Если ваши шаблоны работают не так, как Вы ожидали, возможны следующие причины:
- Специальные символы использованы как обычные, без предшествующего
\ .
- Использовано регулярное выражение, не поддерживаемое в BBEdit. Многие из расширенных операций, существующих, например, в Perl, не реализованы в BBEdit. Некоторые символы, например, цифры, в разных программах обозначаются по-разному (BBEdit использует в качестве обозначения цифры #, а Perl -- \d).
- Шаблон слишком длинный. В BBEdit длина шаблона ограничена.
Данный текст основан на статье Cari D. Burstein, размещенной на www.anybrowser.org
|