4.1 Поиск по шаблону и регулярные выражения contents

Подраздел



4.1 Поиск по шаблону и регулярные выражения

Целый ряд программ обработки текста в Linux позволяют вам производить поиск, а в некоторых случаях и замену текста по шаблону, построенному с использованием специальных правил. К таким программам относятся редакторы текстов: ex, vi, ed, sed; язык awk, a также команды семейства grep и многие другие программы интерпретаторы. Текстовые шаблоны (patterns), которые часто упоминают как регулярные выражения (regular expressions), содержат обычные текстовые символы вместе со специальными символами (часто их называют метасимволы).

Толковый словарь Collins Cobuild English Language Dictionary да©т следующее толкование слова REGULAR: простое, обычное, повторяющееся без изменения, удовлетворяющее простым правилам. Представляется, что такое толкование исчерпывающим образом описывает смысл термина REGULAR EXPRESSIONS - регулярные выражения.

Данная глава содержит следующую информацию:

  • Список метасимволов
  • Описание метасимволов
  • Имена файлов и шаблоны
  • Примеры

4.1.1 Список метасимволов

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

Символ ed ex vi sed awk grep egrep Смысл
. (точка) * * * * * * * Удовлетворяет любому символу.

* (звездочка)

* * * * * * * Удовлетворяет нулевому или большему числу появлений.

E (крышка)

* * * * * * * Должно быть в начале строки.

$ (доллар)

* * * * * * * Должно быть в конце строки.

C ╧(левый слеш)

* * * * * * * Далее идет escape.

[ ]

* * * * * * * Один из набора.

C( C)

* * * Запомнить шаблон для последующего использования.

CB CD

* * * Удовлетворить числу появлений.

CC CE

* * Должно быть на границе слова.
+ * * Одно или более появление.

?

* * Одно или нуль появлений.

C

* * Разделить два шаблона, чтобы показать, что требуется сравнить с тем или с другим шаблоном.

( )

* * Группировать выражения.
Заметим, что в ed, ex и sed во время выполнения операций редактирования (подстановки подстрок) вы определяете оба параметра: поисковый шаблон (слева) и заменяющая подстрока (справа). Метасимволы в приведенной таблице имеют значение лишь для шаблона поиска.

В ed, ex и sed могут использоваться метасимволы, которые имеют значение в заменяющей подстроке:

Символ ex sed ed Действие
C (левый слеш) * * * Далее следует символ escape.

Cn

* * * Использовать подстроку ранее запомненную в C( C)131 .
& (амперсанд) * * Использовать предыдущий шаблон поиска.

E133 (волнистая черточка)

* Использовать предыдущую заменяющую подстроку.

C135 u или CU<

* Перевести все символы в верхний регистр.

C138 l или CL<

* Перевести все символы в нижний регистр.

C141 E<

* Отменить предыдущую команду CU или CL.

C144 e<

* Отменить предыдущую команду Cu или Cl.

4.1.2 Метасимволы

Следующие символы имеют специальное значение только в шаблонах поиска.

<

E Удовлетворяет любому символу исключая newline.

<

* Удовлетворяет любому числу (или нулю) символов, которые следуют за одиночным символом. Предшествующий одиночный символ может также быть регулярным выражением, например, раз . ╧(точка) обозначает любой символ, то выражение .* обозначает любое количество любых символов.

<

E Обозначает последующее регулярное выражение в начале строки.

<

$ Обозначает предшествующее регулярное выражение в конце строки.

<

B D Обозначает любой символ из тех, что заключены в квадратные скобки. Знак переноса в скобках (минус) означает ряд последовательных символов. Знак E (крышка) в качестве первого символа в скобках играет роль отрицания: обозначает любые символы, которые не входят в список. Знак минус или правая (закрывающая) скобка в качестве первого символа рассматривается как члены списка.

<

BE D Обозначает любые символы не входящие в список, ограниченный скобками.

<

CBn,mCD Обозначает ряд появлений одиночного символа, который непосредственно предшествует этому выражению. Предшествующий символ тоже может быть регулярным выражением. Выражение CBn<CD обозначает ровно n появлений, выражение CBn,CD означает как минимум n появлений, выражение CBn,m<CD обозначает, что число появлений не меньше n и не больше m. При этом, n и m должны быть от 0 до 256.

<

C Выключить специальное значение последующего символа.

<

C( C) Сохранить подстроку, заключенную между C( и C) в специальном месте для последующего использования. До девяти подстрок может быть сохранено в одной строке. Сохраненные подстроки могут быть вызваны и использованы в последующих подстановках посредством escape выражений от C1 до C9.

<

CC CE Обозначает символы в начале ( CC) или в конце ( CE) слова.

<

+ Обозначает одно или больше появлений предшествующего регулярного выражения.

<

? Обозначает одно или нуль появлений предшествующего регулярного выражения.

<

C Обозначает регулярное выражение определенное до или после.

<

( ) Группирование регулярных выражений.

Последующие символы имеют специальное значение только в заменяющих подстроках.

<

C Выключить специальное значение последующего символа.

<

Cn Взять n-ную подстроку ранее сохраненную с помощью выражений C ( и C ). Здесь n есть целое от 1 до 9. Самое левое выражение имеет номер 1.

<

& Использовать поисковый шаблон в текущей заменяющей подстроки.

<

E Использовать предыдущую заменяющую подстроку в текущей заменяющей подстроке.

<

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

<

CU Преобразовать всю заменяющую подстроку в верхний регистр.

<

Cl Преобразовать первый символ заменяющей подстроки в нижний регистр.

<

CL Преобразовать всю заменяющую подстроку в нижний регистр.

4.1.3 Примеры поиска

<

Шаблон <
tex2html_comment_mark>176 Чему может соответствовать

<

big <
tex2html_comment_mark>178 Строка big

<

Ebig <
tex2html_comment_mark>180 big здесь в начале строки

<

big$ <
tex2html_comment_mark>182 а здесь в конце строки есть big

<

Ebig$ <
tex2html_comment_mark>184 слово big должно быть единственным словом в строке

<

[Bb]ig <
tex2html_comment_mark>186 найдет big и Big

<

b[aeiou]g <
tex2html_comment_mark>188 найдет слова или части слов из трех букв: bag, beg, big, bog, bug

<

b[Eaeiou]g <
tex2html_comment_mark>190 обозначает все слова или части слов из трех букв, которые между буквами 'b' и 'g' НЕ содержат букв, перечисленных в квадратных скобках: 'a', 'e', 'i', 'o', 'u'

<

E...$ <
tex2html_comment_mark>192 обозначает любую полную строку, состоящую ровно из трех любых символов

<

b.g <
tex2html_comment_mark>194 обозначает все слова или части слов из трех букв, которые между буквами 'b' и 'g' могут содержать любой символ, например, b2g, big, bug, b?g и т.п.

<

EC. <
tex2html_comment_mark>197 обозначает любую строку, которая начинается с точки

<

E[E.] <
tex2html_comment_mark>201 обозначает любую строку, которая начинается НЕ с точки. Заметим попутно, что если один и тот же текстовый файл просмотреть с использованием программы egrep с только что описанными шаблонами поиска 'EC.', а затем 'E[E.]', то мы обнаружим, что суммарное количество найденных строк может оказаться не равно общему числу строк в файле. Такое происходит из-за того, что часть строк файла могут содержать единственный символ newline.

<

EC.[a-z][a-z] <
tex2html_comment_mark>203 то же самое, но за точкой следуют две любые буквы в нижнем регистре

<

E$ <
tex2html_comment_mark>206 обозначает пустую строку, которая состоит только из символа newline

<

EC.[a-z][a-z]CB2CD209 <
tex2html_comment_mark>210 то же самое , но только для grep или sed

<

bog* <
tex2html_comment_mark>212 обозначает любое из слов или частей слова: 'bog', 'bogs', 'bogus' и т.д.

<

0CB3,CD <
tex2html_comment_mark>215 только для sed и egrep: три или более нулей подряд

<

[0-9]CB2CD-[0-9]CB5CD-[0-9]CB1CD <
tex2html_comment_mark>220 только для sed и egrep: число которое имеет вид nn-nnnnn-n

4.1.4 Примеры поиска и замены

Нижеследующие примеры показывают как метасимволы могут использоваться в редакторе sed. Символ помеченный как  обозначает в данном примере пробел. Символ табуляции обозначен как tab.

<

Команда Результат

<

s/.*/(&)/ Заменить всю строку на нее же, но в скобках.

<

s/.*/mv & &.old/ Изменить список слов (одно слово на строку) в команде mv.

<

/^$/d Удалить пустые строки, т.е. строки содержащие один символ newline.

<

/[ tab]*$/d Удалить пустые строки, а также строки содержащие пробелы или табуляторы.

<

s/*//g Превратить два и более пробелов в один пробел.

<

s/Yes/No/ Заменить слова в строке.


contents
Обновлено: 16.03.2015