Меню Закрыть

Egrep примеры регулярных выражений

Содержание

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

  • Проверка ввода текста;
  • Поиск и замена текста в файле;
  • Пакетное переименование файлов;
  • Взаимодействие с сервисами, таким как Apache;
  • Проверка строки на соответствие шаблону.

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

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

Регулярные выражения Linux

В регулярных выражениях могут использоваться два типа символов:

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

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

обычный_символ спецсимвол_оператор

спецсимвол_замены спецсимвол_оператор

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

  • — с обратной косой черты начинаются буквенные спецсимволы, а также он используется если нужно использовать спецсимвол в виде какого-либо знака препинания;
  • ^ — указывает на начало строки;
  • $ — указывает на конец строки;
  • * — указывает, что предыдущий символ может повторяться 0 или больше раз;
  • + — указывает, что предыдущий символ должен повторится больше один или больше раз;
  • ? — предыдущий символ может встречаться ноль или один раз;
  • — указывает сколько раз (n) нужно повторить предыдущий символ;
  • — предыдущий символ может повторяться от N до n раз;
  • . — любой символ кроме перевода строки;
  • [az] — любой символ, указанный в скобках;
  • х|у — символ x или символ y;
  • [^az] — любой символ, кроме тех, что указаны в скобках;
  • [a-z] — любой символ из указанного диапазона;
  • [^a-z] — любой символ, которого нет в диапазоне;
  •  — обозначает границу слова с пробелом;
  • B — обозначает что символ должен быть внутри слова, например, ux совпадет с uxb или tuxedo, но не совпадет с Linux;
  • d — означает, что символ — цифра;
  • D — нецифровой символ;

  • — символ перевода строки;
  • s — один из символов пробела, пробел, табуляция и так далее;
  • S — любой символ кроме пробела;
  • — символ табуляции;
  • v — символ вертикальной табуляции;
  • w — любой буквенный символ, включая подчеркивание;
  • W — любой буквенный символ, кроме подчеркивания;
  • uXXX — символ Unicdoe.

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

Например, вы хотите найти в тексте строку 1+ 2=3. Если вы используете эту строку в качестве регулярного выражения, то ничего не найдете, потому что система интерпретирует плюс как спецсимвол, который сообщает, что предыдущая единица должна повториться один или больше раз. Поэтому его нужно экранировать: 1 + 2 = 3. Без экранирования наше регулярное выражение соответствовало бы только строке 11=3 или 111=3 и так далее. Перед равно черту ставить не нужно, потому что это не спецсимвол.

Примеры использования регулярных выражений

Теперь, когда мы рассмотрели основы и вы знаете как все работает, осталось закрепить полученные знания про регулярные выражения linux grep на практике. Два очень полезные спецсимвола — это ^ и $, которые обозначают начало и конец строки. Например, мы хотим получить всех пользователей, зарегистрированных в нашей системе, имя которых начинается на s. Тогда можно применить регулярное выражение "^s". Вы можете использовать команду egrep:

egrep "^s" /etc/passwd

Если мы хотим отбирать строки по последнему символу в строке, что для этого можно использовать $. Например, выберем всех системных пользователей, без оболочки, записи о таких пользователях заканчиваются на false:

egrep "false$" /etc/passwd

Чтобы вывести имена пользователей, которые начинаются на s или d используйте такое выражение:

egrep "^[sd]" /etc/passwd

Такой же результат можно получить, использовав символ "|". Первый вариант более пригоден для диапазонов, а второй чаще применяется для обычных или/или:

egrep "^[s|d]" /etc/passwd

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

egrep "^w<3>:" /etc/passwd

Выводы

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

На завершение лекция от Яндекса про регулярные выражения:

Предложение от 8host.com

Вступление

Одна из наиболее полезных и многофункциональных команд в терминале Linux – команда «grep». Grep – это акроним, который расшифровывается как «global regular expression print» (то есть, «искать везде соответствующие регулярному выражению строки и выводить их»). Это значит, что grep можно использовать для того, чтобы просмотреть, соответствуют ли вводимые данные заданным шаблонам.

Эта на первый взгляд тривиальная программа очень мощна при верном использовании. Ее способность сортировать вводимые данные на основе сложных правил делает ее популярной связкой во многих цепях команд.

Данное руководство рассматривает некоторые возможности команды grep, а затем переходит к использованию регулярных выражений. Все описанные в данном руководстве техники можно применить в управлении виртуальным сервером.

Основы использования

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

В качестве примера можно использовать grep для поиска строк, содержащих слово «GNU» в версии 3 GNU General Public License на системе Ubuntu.

cd /usr/share/common-licenses
grep "GNU" GPL-3
GNU GENERAL PUBLIC LICENSE
The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
Developers that use the GNU GPL protect your rights with two steps:
"This License" refers to version 3 of the GNU General Public License.
13. Use with the GNU Affero General Public License.
under version 3 of the GNU Affero General Public License into a single
.
.

Первый аргумент, «GNU», является искомым шаблоном, а второй аргумент, «GPL-3», является входным файлом, который нужно найти.

В результате будут выведены все строки, содержащие текстовый шаблон. В некоторых дистрибутивах Linux искомый шаблон будет выделен в выведенных строках.

Общие опции

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

При необходимости игнорировать регистр параметра поиска и искать как прописные, так и строчные вариации шаблона, можно использовать утилиты «-i» или «—ignore-case».

Для примера можно использовать grep для поиска в том же файле слова «license», написанного верхним, нижним или смешанным регистром.

grep -i "license" GPL-3
GNU GENERAL PUBLIC LICENSE
of this license document, but changing it is not allowed.
The GNU General Public License is a free, copyleft license for
The licenses for most software and other practical works are designed
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
price. Our General Public Licenses are designed to make sure that you
(1) assert copyright on the software, and (2) offer you this License
"This License" refers to version 3 of the GNU General Public License.
"The Program" refers to any copyrightable work licensed under this
.
.

Читайте также:  Как переделать файл в пдф формат

Как можно видеть, выведенные результаты содержат «LICENSE», «license», and «License». Если бы в файле был экземпляр «LiCeNsE», он также был бы выведен.
При необходимости найти все строки, которые не содержат указанный шаблон, можно использовать флаги «-v» или «—invert-match».

Для примера можно применить следующую команду для поиска в лицензии BSD всех строк, которые не содержат слово «the»:

grep -v "the" BSD
All rights reserved.
Redistribution and use in source and binary forms, with or without
are met:
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS «AS IS» AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.
.

Как можно видеть, последние две строки были выведены как не содержащие слова «the», поскольку команда «ignore case» не была использована.

Всегда полезно знать номера строк, в которых были обнаружены совпадения. Их можно узнать при помощи флагов «-n» или «—line-number» .

Если применить данный флаг в предыдущем примере, будет выведен следующий результат:

grep -vn "the" BSD
2:All rights reserved.
3:
4:Redistribution and use in source and binary forms, with or without
6:are met:
13: may be used to endorse or promote products derived from this software
14: without specific prior written permission.
15:
16:THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS «AS IS» AND
17:ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.
.

Теперь можно сослаться на номер строки при необходимости внести изменения в каждой строке, которая не содержит «the».

Регулярные выражения

Как было сказано во вступлении, grep расшифровывается как «global regular expression print». Регулярное выражение – это текстовая строка, которая описывает определенный шаблон поиска.

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

Буквенные совпадения

В приведенных выше примерах поиска слов «GNU» и «the» разыскивались очень простые регулярные выражения, точно соответствующие строке символов «GNU» и «the».

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

Шаблоны, точно соответствующие заданным символам, называются «буквенными», поскольку они соответствуют шаблону побуквенно, символ в символ.

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

Совпадения анкоров

Анкоры – это специальные символы, которые указывают местонахождение в строке необходимого совпадения.

К примеру, можно указать, что при поиске нужны только строки, содержащие слово «GNU» в самом начале. Для этого нужно использовать анкор «^» перед буквенной строкой.

В этом примере выведены только строки, содержащие в самом начале слово «GNU».

grep "^GNU" GPL-3
GNU General Public License for most of our software; it applies also to
GNU General Public License, you may choose any version ever published

Аналогично, анкор «$» можно использовать после буквенной строки, чтобы указать, что совпадение действительно, только если искомая строка символов находится в конце текстовой строки.

В следующем регулярном выражении выведены только те строки, которые содержат «and» в конце:

grep "and$" GPL-3
that there is no warranty for this free software. For both users’ and
The precise terms and conditions for copying, distribution and
License. Each licensee is addressed as "you". "Licensees" and
receive it, in any medium, provided that you conspicuously and
alternative is allowed only occasionally and noncommercially, and
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
provisionally, unless and until the copyright holder explicitly and
receives a license from the original licensors, to run, modify and
make, use, sell, offer for sale, import and otherwise run, modify and

Совпадение любого символа

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

К примеру, при необходимости найти совпадения, содержащие два символа и затем последовательность «cept», нужно использовать следующий шаблон:

grep "..cept" GPL-3
use, which is precisely where it is most unacceptable. Therefore, we
infringement under applicable copyright law, except executing it on a
tells the user that there is no warranty for the work (except to the
License by making exceptions from one or more of its conditions.
form of a separately written license, or stated as exceptions;
You may not propagate or modify a covered work except as expressly
9. Acceptance Not Required for Having Copies.
.
.

Как можно видеть, в результатах выведены слова «accept» and «except», а также вариации этих слов. Шаблон также совпал бы с последовательностью «z2cept», если бы такая была в тексте.

Выражения в скобках

Поместив группу символов в квадратные скобки («[ ]»), можно указать, что в данной позиции может находиться любой из взятых в скобки символов.

Это значит, что при необходимости найти строки, содержащие «too» или «two», можно кратко указать данные вариации, используя следующий шаблон:

grep "t[wo]o" GPL-3
your programs, too.
freedoms that you received. You must make sure that they, too, receive
Developers that use the GNU GPL protect your rights with two steps:
a computer network, with no transfer of a copy, is not conveying.
System Libraries, or general-purpose tools or generally available free
Corresponding Source from a network server at no charge.
.
.

Как можно видеть, обе вариации были найдены в файле.

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

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

grep "[^c]ode" GPL-3
1. Source Code.
model, to give anyone who possesses the object code either (1) a
the only significant mode of use of the product.
notice like this when it starts in an interactive mode:

Стоит заметить, что вторая выведенная строка содержит слово «code». Это не ошибка регулярного выражения или команды grep.

Вернее, эта строка была выведена, потому что она также содержит соответствующую шаблону последовательность «mode», найденную в слове «model». То есть, строка была выведена потому, что в ней было обнаружено совпадение с шаблоном.

Еще одна полезная функция скобок – возможность указать диапазон символов вместо того, чтобы отдельно вводить каждый символ.

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

grep "^[A-Z]" GPL-3
GNU General Public License for most of our software; it applies also to
States should not allow patents to restrict development and use of
License. Each licensee is addressed as "you". "Licensees" and
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
System Libraries, or general-purpose tools or generally available free
Source.
User Product is transferred to the recipient in perpetuity or for a
.
.

В связи с некоторыми наследственными проблемами сортировки, для более точного результата лучше использовать классы символов стандарта POSIX вместо диапазона символов, использованного в примере выше.
Существует множество классов символов, не охваченных данным руководством; к примеру, чтобы выполнить ту же процедуру, что и в примере выше, можно использовать класс символов «[:upper:]» в скобках.

Читайте также:  Выбор планшета цена качество

grep "^[[:upper:]]" GPL-3
GNU General Public License for most of our software; it applies also to
States should not allow patents to restrict development and use of
License. Each licensee is addressed as "you". "Licensees" and
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
System Libraries, or general-purpose tools or generally available free
Source.
User Product is transferred to the recipient in perpetuity or for a
.
.

Шаблон повторения (0 или больше раз)

Одним из наиболее часто используемых метасимволов является символ «*», что означает «повторить предыдущий символ или выражение 0 или больше раз».

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

grep "([A-Za-z ]*)" GPL-3
Copyright (C) 2007 Free Software Foundation, Inc.
distribution (with or without modification), making available to the
than the work as a whole, that (a) is included in the normal form of
Component, and (b) serves only to enable use of the work with that
(if any) on which the executable work runs, or a compiler used to
(including a physical distribution medium), accompanied by the
(including a physical distribution medium), accompanied by a
place (gratis or for a charge), and offer equivalent access to the
.
.

Как избежать метасимволов

Иногда может понадобиться искать буквальную точку или буквальную открытую скобку. Поскольку данные символы имеют определенное значение в регулярных выражениях, необходимо «избегать» их, говоря команде grep, что в данном случае использовать их особое значение не нужно.

Этих символов можно избежать, используя обратную косую () перед символом, который обычно имеет особое значение.

К примеру, при необходимости найти строку, что начинается с заглавной и заканчивается точкой, можно использовать приведенное ниже выражение. Обратная косая перед последней точкой говорит команде «избегать» ее, так что последняя точка представляет буквальную точку и не имеет значения «любой символ»:

grep "^[A-Z].*.$" GPL-3
Source.
License by making exceptions from one or more of its conditions.
License would be to refrain entirely from conveying the Program.
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
SUCH DAMAGES.
Also add information on how to contact you by electronic and paper mail.

Расширенные регулярные выражения

Команду Grep можно также использовать с расширенным языком регулярных выражений при помощи флага «-E» или же вызывая команду «egrep» вместо «grep».

Эти команды открывают возможности «расширенных регулярных выражений». Расширенные регулярные выражения включают в себя все основные метасимволы, а также дополнительные метасимволы для выражения более сложных совпадений.

Группирование

Одна из простейших и полезнейших возможностей, которые открывают расширенные регулярные выражения, — это возможность группировать выражения и использовать их как единое целое.

Для группирования выражений используются круглые скобки. При необходимости использовать круглые скобки вне расширенных регулярных выражений, их можно «избежать» при помощи обратной косой

grep "(grouping)" file.txt
grep -E "(grouping)" file.txt
egrep "(grouping)" file.txt

Приведенные выше выражения являются эквивалентами.

Чередование

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

Для обозначения чередования используется символ вертикальной черты «|». Чередование часто применяется в группировании для того, чтобы указать, что один из двух или более возможных вариантов должен рассматриваться как совпадение.

В данном примере нужно найти «GPL» или «General Public License»:

grep -E "(GPL|General Public License)" GPL-3
The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
price. Our General Public Licenses are designed to make sure that you
Developers that use the GNU GPL protect your rights with two steps:
For the developers’ and authors’ protection, the GPL clearly explains
authors’ sake, the GPL requires that modified versions be marked as
have designed this version of the GPL to prohibit the practice for those
.
.

Чередование можно использовать для выбора между двумя и более вариантами; для этого нужно ввести остальные варианты в группу отбора, отделяя каждый при помощи символа вертикальной черты «|».

Кванторы

В расширенных регулярных выражениях существуют метасимволы, указывающие частоту повторения символа, подобно тому, как метасимвол «*» указывает на совпадения предыдущего символа или строки символов 0 или более раз.

Чтобы указать совпадение символа 0 или больше раз, можно использовать символ «?». Он сделает предыдущий символ или ряд символов, по сути, необязательными.

В данном примере при помощи внесения последовательности «copy» в факультативную группу выведены совпадения «copyright» и «right»:

grep -E "(copy)?right" GPL-3
Copyright (C) 2007 Free Software Foundation, Inc.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
"Copyright" also means copyright-like laws that apply to other kinds of
.
.

Символ «+» ищет совпадения выражений 1 или больше раз. Он работает почти как символ «*», но при использовании «+» выражение должно совпасть хотя бы 1 раз.

Приведенное ниже выражение ищет совпадения строки «free» плюс 1 или больше символов, которые не являются пробельными:

grep -E "free[^[:space:]]+" GPL-3
The GNU General Public License is a free, copyleft license for
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
When we speak of free software, we are referring to freedom, not
have the freedom to distribute copies of free software (and charge for
you modify it: responsibilities to respect the freedom of others.
freedoms that you received. You must make sure that they, too, receive
protecting users’ freedom to change the software. The systematic
of the GPL, as needed to protect the freedom of users.
patents cannot be used to render the program non-free.

Количество повторений совпадений

При необходимости указать количество повторения совпадений можно использовать фигурные скобки («< >»). Эти символы используются для указания точного количества, диапазона, а также верхнего и нижнего предела количества совпадений выражения.

При необходимости найти все строки, что содержат сочетание трех гласных, можно использовать следующее выражение:

grep -E "[AEIOUaeiou]<3>" GPL-3
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
receive it, in any medium, provided that you conspicuously and
give under the previous paragraph, plus a right to possession of the
covered work so as to satisfy simultaneously your obligations under this
При необходимости найти все слова, состоящие из 16-20 символов, используйте следующее выражение:
grep -E "[[:alpha:]]<16,20>" GPL-3
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
c) Prohibiting misrepresentation of the origin of that material, or

Выводы

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

Регулярные выражения еще более многофункциональны и могут быть использованы во многих популярных программах. К примеру, многие текстовые редакторы применяют регулярные выражения для поиска и замены текста.

Более того, передовые языки программирования используют регулярные выражения для выполнения процедур на конкретных фрагментах данных. Умение работать с регулярными выражениями пригодится при решении общих задач, связанных с компьютером.

Читайте также:  Msi gtx 1050 ms v809

Резюме : Регулярные выражения используются для расширенного контекстного поиска и модификации текста. Они могут быть во многих профессиональных редакторах, в программах синтаксического анализа (parser programs) и в языках.

Введение

Регулярные выражения применяются во многих редакторах таких как vi и emacs, в программах grep/egrep и языках таких как awk, perl и sed.

Регулярные выражения используются для расширенного контекстного поиска и модификации текста. Регулярное выражение — это формальное описание шаблона, который соответстует текстовой строке.

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

Хотя регулярные выражения очень широко распространены в мире Unix, но не существует такой штуки как ‘стандартный язык регулярных выражений’. Существует несколько различных диалектов. Например существует два типа программы grep; grep и egrep. Обе используют регулярные выражения с незначительно отличающимися возможностями. Perl возможно имеет более полный набор регулярных выражений. К счастью все они следуют общим принципам. Как только вы поймете основную идею, то вам будет легко изучить детали различных диалектов.

Эта статья введет вас в основы и вы сможете изучить различные аспекты и возможности программ на их man-страницах.

Простой пример

Пусть вы имеете список телефонов компании и он выглядит подобно этому:

Это компания из 500 человек. Они хранят данные в простом текстовом файле. Человек с первой цифрой телефонного номера равной 1 работает в строении N 1. Кто работает в строении 1 ?

На словах это значит, искать все строки, которые начинаются с единицы. "^" соответствует началу строки. Благодаря этому символу выражение соответствует только тем строкам, которые начинаются с единицы.

Синтаксис

Односимвольные шаблоны

Основным строительным блоком регулярных выражений является односимвольный шаблон. Он соответствует просто этому символу. Примером односимвольного шаблона является 1 в предыдущем примере. Она просто соответствует единице в тексте.

Этот шаблон состоит только из односимвольных шаблонов (буквы K,e. )

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

Это ищет строки, которые начинаются с 13 или 14 или 18.

Мы уже увидели, что большинство ASCII символов просто соответствуют этим же ASCII символам, но некоторые ASCII символы, называемые метасимволами, имеют специальное значение. Например квадратные скобки ограничивают класс. Смысл "-" в классе это интервал. Чтобы отменить специальное значение метасимвола нужно поставить перед ним обратный слеш. Пример этого — знак минус в [a-zA-Z0-9-]. В некоторых диалектах регулярных выражений метасимволы начинаются с обратного слеша. В этом случае вы должны удалить обратный слеш, что бы получить нормальное значение символа.

Точка это важный метасимвол. Она соответствует любому символу кроме символа новой строки. Пример:

Эти выражения используются для поиска строк с цифрой 2 во второй позиции и любым первым символом.

Если определение класса начинается с "[^" вместо "[" то это означает отрицание этого класса (все символы кроме указанных). Теперь "^" больше не означает начало строки, но в комбинации с "[" обозначает отрицание класса.

Фиксирование шаблонов

В предыдущей части мы уже увидели, что "^" соответствует началу строки. Фиксирование шаблонов производится при помощи специальных символов, которые соответствуют определенной позиции в тексте, а не просто символу.

Чтобы найти человека с ID номер 567 в нашем phonelist.txt мы можем использовать:

Это покажет строки с числом 567 в конце.

Множители

Множители определяют сколько раз односимвольный шаблон повторяется в тексте.

Описание grep egrep perl vi vim vile elvis emacs
ноль или больше раз * * * * * * * *
один или больше раз + + + + + +
ноль или один раз ? ? ? = ? = ?
от n до m раз

Примечание: Различные VI’и имеют магические опции установки для того чтобы они работали как показано выше.

Пример из телефонного списка:

Для нахождения строк, которые начинаются с 1, и имеют несколько цифр, как минимум один пробел и имя начинающееся с буквы К мы можем написать:

Множитель размножает предыдущий односимвольный шаблон. Так "23*4" не означает "2 , затем 3, затем что угодно и 4" (Это выглядит как "23.*4"). А это означает "один раз 2 потом может быть несколько 3 и одна 4"

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

Это не имеет большого значения для grep, но важно для редактирования и подстановки.

Круглые скобки как способ запоминания

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

Запомненная часть доступна через переменные. часть строки ограниченная первой парой скобок доступна через переменную один, вторая через переменную два и т.д.

Имя программы Синтаксис скобок Синтаксис переменной
grep () 1
egrep () 1
perl () 1 or $
vi,vim,vile,elvis () 1
emacs () 1

теперь мы можем использовать эти переменные для создания шаблонов для поиска текста такого как ‘otto’:

Круглые скобки как способ запоминания не так часто используются для нахождения таких имен как otto и anna, а применяются для редактирования и подстановки.

Использование регулярных выражений для редактирования текста

Для редактирования вам необходим редактор такой как vi, emacs или вы можете использовать например perl.

В emacs вы используете M-x query-replace-regexp или вы можете для этого переопределить любую функциональную клавишу. Или вы можете также использовать команду replace-regexp. Команда query-replace-regexp интерактивная, другие нет.

В vi используется команда подстановки :%s/ / /gc. Процент определяет диапазон ‘весь файл’ и может быть заменен любым подходящим диапазоном. В vim вы нажимаете shift-v, помечаете область и тогда используете подстановку только в этой области. Я не буду говорить больше о vim потому, что все должно быть в его собственном руководстве. Интерактивная версия команды это ‘s/ / /gc’, а не интерактивная это s/ / /g

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

В Perl’е вы можете использовать

Посмотрите несколько примеров. План нумерации в нашей компании изменился и во всех телефонных номерах, которые начинаются с 1 необходимо вставить 2 после второй цифры.

Например 1423 должно стать 14223.

Как сделать это:

Перл может обрабатывать переменные с номерами больше чем от 1 до 9 поэтому 12 будет ссылаться на 12-ю переменную которая кстати пустая. Для преодоления этого мы просто используем $<1>.

Теперь выравнивание в списке немного нарушено. Как вы можете это исправить ? Вы должны просто проверить есть ли пробел в 5-й позиции и если есть, то вставить еще один:

Коллеги в ручную поредактировали список и случайно вставили несколько пробелов в начале некоторых строк. Как мы можем удалить их ?

Вы пишите программу и в ней у вас есть переменные temp и temporary. Теперь вы хотите заменить переменную temp переменной counter. Если вы просто замените строку temp на counter, то тогда переменная temporary станет counterrary, что видимо не то, что вы хотите.

Регулярные выражения могут сделать это. Просто меняем temp([^o]) на counter1. Это значит temp без буквы o. (Альтернативным решением может быть использование границ, но мы не рассматриваем этот случай привязки шаблона.)

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

Есть еще много других специальных символов таких как, например символы условий, типа "или" и также символы границ слов, упоминаемые выше.

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.