- Bash-скрипты: регулярные выражения
- Что такое регулярные выражения
- Типы регулярных выражений
- Регулярные выражения POSIX BRE
- Регулярные выражения. Стандарт POSIX. Ускоряем работу с документами
- Регулярные выражения linux posix
- Примечания
- Regular Expressions/POSIX Basic Regular Expressions
- Contents
- History [ edit | edit source ]
- Syntax [ edit | edit source ]
- Character classes [ edit | edit source ]
- Collating symbols [ edit | edit source ]
- Equivalence classes [ edit | edit source ]
- External links [ edit | edit source ]
- Use in Tools [ edit | edit source ]
Bash-скрипты: регулярные выражения
Для того, чтобы полноценно обрабатывать тексты в bash-скриптах с помощью sed и awk, просто необходимо разобраться с регулярными выражениями. Реализации этого полезнейшего инструмента можно найти буквально повсюду, и хотя устроены все регулярные выражения схожим образом, основаны на одних и тех же идеях, в разных средах работа с ними имеет определённые особенности. Тут мы поговорим о регулярных выражениях, которые подходят для использования в сценариях командной строки Linux.
Этот материал задуман как введение в регулярные выражения, рассчитанное на тех, кто может совершенно не знать о том, что это такое. Поэтому начнём с самого начала.
- 1 Что такое регулярные выражения
- 2 Типы регулярных выражений
- 3 Регулярные выражения POSIX BRE
- 4 Специальные символы
- 5 Якорные символы
- 6 Символ «точка»
- 7 Классы символов
- 8 Отрицание классов символов
- 9 Диапазоны символов
- 10 Специальные классы символов
- 11 Символ «звёздочка»
- 12 Регулярные выражения POSIX ERE
- 12.1 ▍Вопросительный знак
- 12.2 ▍Символ «плюс»
- 12.3 ▍Фигурные скобки
- 12.4 ▍Символ логического «или»
- 14.1 ▍Подсчёт количества файлов
- 14.2 ▍Проверка адресов электронной почты
Что такое регулярные выражения
У многих, когда они впервые видят регулярные выражения, сразу же возникает мысль, что перед ними бессмысленное нагромождение символов. Но это, конечно, далеко не так. Взгляните, например, на это регулярное выражение
^ ( [ a — zA — Z0 — 9_ \ — \ . \ + ] + ) @ ( [ a — zA — Z0 — 9_ \ — \ . ] + ) \ . ( [ a — zA — Z ] < 2 , 5 >) $
На наш взгляд даже абсолютный новичок сходу поймёт, как оно устроено и зачем нужно 🙂 Если же вам не вполне понятно — просто читайте дальше и всё встанет на свои места.
Регулярное выражение — это шаблон, пользуясь которым программы вроде sed или awk фильтруют тексты. В шаблонах используются обычные ASCII-символы, представляющие сами себя, и так называемые метасимволы, которые играют особую роль, например, позволяя ссылаться на некие группы символов.Типы регулярных выражений
Реализации регулярных выражений в различных средах, например, в языках программирования вроде Java, Perl и Python, в инструментах Linux вроде sed, awk и grep, имеют определённые особенности. Эти особенности зависят от так называемых движков обработки регулярных выражений, которые занимаются интерпретацией шаблонов.
В Linux имеется два движка регулярных выражений:- Движок, поддерживающий стандарт POSIX Basic Regular Expression (BRE).
- Движок, поддерживающий стандарт POSIX Extended Regular Expression (ERE).
Большинство утилит Linux соответствуют, как минимум, стандарту POSIX BRE, но некоторые утилиты (в их числе — sed) понимают лишь некое подмножество стандарта BRE. Одна из причин такого ограничения — стремление сделать такие утилиты как можно более быстрыми в деле обработки текстов.
Стандарт POSIX ERE часто реализуют в языках программирования. Он позволяет пользоваться большим количеством средств при разработке регулярных выражений. Например, это могут быть специальные последовательности символов для часто используемых шаблонов, вроде поиска в тексте отдельных слов или наборов цифр. Awk поддерживает стандарт ERE.
Существует много способов разработки регулярных выражений, зависящих и от мнения программиста, и от особенностей движка, под который их создают. Непросто писать универсальные регулярные выражения, которые сможет понять любой движок. Поэтому мы сосредоточимся на наиболее часто используемых регулярных выражениях и рассмотрим особенности их реализации для sed и awk.
Регулярные выражения POSIX BRE
Пожалуй, самый простой шаблон BRE представляет собой регулярное выражение для поиска точного вхождения последовательности символов в тексте. Вот как выглядит поиск строки в sed и awk:
Регулярные выражения. Стандарт POSIX. Ускоряем работу с документами
Большинство офисных программ (Excel, Word, Notepad++ и т.п.) имеют возможность обрабатывать и изменять введенные данные используя регулярные выражения. Для регулярных выражений зачастую используется Posix. О том как работает этот язык, расшифровка команд и примеры для использования разберем ниже.
Стандарт POSIX также делит регулярные выражения на две категории: BRE (Basic Regular Expressions) и ERE (Extended Regular Expressions).
группирование символов в скобках (скобки экранируются обратным слэшем)
группирование символов в скобках
Запоминание и повторное использование \1. \9
квантификаторы + и ? и конструкцию выбора
В стандарте POSIX используется понятие локального контекста (locale) — совокупности параметров, описывающих языковые и культурные правила: формат даты и времени, интерпретация символов активной кодировки и т.д. Это не относится напрямую к регулярным выражениям, но влияет на их функционирование. При работе в локальном контексте с кодировкой UTF-8, принятой почти во всех современных дистрибутивах, корректно обрабатываются символы русского алфавита и их диапазоны, т.е. можно указывать диапазоны [а-я] и [А-Я] в шаблонах поиска.
Метасимволы — символы обладающие какими либо свойствами (обозначающие любой знак, начало или конец строки и т.п.).
Квантификаторы — указатели количества заданных символов:
[012345789] — соответствует одному цифровому символу из заданного набора;
[аеёиоуыэюя] — соответствует одной из перечисленных гласных букв;
[. ;] — соответствует одному из символов пунктуации.
[a-zA-Z] или [a-Z] — любая буква от a до z в любом регистре
[^] — негативный класс символов («любое кроме»)
[^0-9] — соответствует любому символу, кроме цифрового;
[^аеёиоуыэюя] — соответствует любой НЕ гласной букве.
— — обозначение последовательности в классе символов цифры)
Регулярные выражения linux posix
Для того, чтобы полностью реализовать потенциал командной оболочки, вам придется овладеть Регулярными Выражениями. Многие команды и утилиты, обычно используемые в сценариях, такие как grep, expr, sed и awk, используют Регулярные Выражения.
- Звездочка — * — означает любое количество символов в строке, предшествующих «звездочке», в том числе и нулевое число символов . Выражение «1133*» — означает 11 + один или более символов «3» + любые другие символы: 113, 1133, 113312, и так далее. Точка — . — означает не менее одного любого символа, за исключением символа перевода строки (\n). [2] Выражение «13.» будет означать 13 + по меньшей мере один любой символ (включая пробел): 1133, 11333, но не 13 (отсутствуют дополнительные символы).
- Символ — ^ — означает начало строки, но иногда, в зависимости от контекста, означает отрицание в регулярных выражениях. Знак доллара — $ — в конце регулярного выражения соответствует концу строки. Выражение «^$» соответствует пустой строке.
Символы ^ и $ иногда еще называют якорями , поскольку они означают, или закрепляют, позицию в регулярных выражениях. bash$ cat textfile This is line 1, of which there is only one instance. This is the only instance of line 2. This is line 3, another line. This is line 4. bash$ grep 'the' textfile This is line 1, of which there is only one instance. This is the only instance of line 2. This is line 3, another line. bash$ grep '\' textfile This is the only instance of line 2.
# GNU версии sed и awk допускают использование "+", # но его необходимо экранировать. echo a111b | sed -ne '/a1\+b/p' echo a111b | grep 'a1\+b' echo a111b | gawk '/a1+b/' # Все три варианта эквивалентны. # Спасибо S.C.
bash$ echo 2222 | gawk --re-interval '/2/' 2222
bash$ egrep 're(a|e)d' misc.txt People who read seem to be better informed than those who do not. The clarinet produces sound by the vibration of its reed.
Некоторые версии sed, ed и ex поддерживают экранированные версии регулярных выражений, описанных выше.
bash$ grep [[:digit:]] test.file abc=723
bash$ ls -l ?[[:digit:]][[:digit:]]? -rw-rw-r-- 1 bozo bozo 0 Aug 21 14:47 a33b
Sed, awk и Perl, используемые в сценариях в качестве фильтров, могут принимать регулярные выражения в качестве входных аргументов. См. Пример A-13 и Пример A-19.
Примечания
В качестве простейшего регулярного выражения можно привести строку, не содержащую никаких метасимволов.
Поскольку с помощью sed, awk и grep обрабатывают одиночные строки, то обычно символ перевода строки не принимается во внимание. В тех же случаях, когда производится разбор многострочного текста, метасимвол «точка» будет соответствовать символу перевода строки.
Regular Expressions/POSIX Basic Regular Expressions
The POSIX Basic Regular Expression (BRE) syntax provided extensions to achieve consistency between utility programs such as grep, sed and awk. These extensions are not supported by some traditional implementations of Unix tools.
Contents
History [ edit | edit source ]
Traditional Unix regular expression syntax followed common conventions that often differed from tool to tool. The POSIX Basic Regular Expressions syntax was developed by the IEEE, together with an extended variant called Extended Regular Expression syntax. These standards were designed mostly to provide backward compatibility with the traditional Simple Regular Expressions syntax, providing a common standard which has since been adopted as the default syntax of many Unix regular expression tools.
Syntax [ edit | edit source ]
In POSIX Basic Regular Expression syntax, most characters are treated as literals — they match only themselves (e.g., a matches «a«). The exceptions, listed below, are called metacharacters or metasequences.
The — character is treated as a literal character if it is the last or the first character within the brackets: [abc-] , [-abc] . The ] character can be included in a bracket expression if it is the first character: []abc] . The bracket expression may also contain character classes, equivalence classes, and collating characters.
The — character is treated as a literal character if it is the last character or the first characted after ^ : [^abc-] , [^-abc] . The ] character is treated as a literal character if it is the first character after ^ : [^]abc] . The expression may also contain character classes, equivalence classes, and collating characters.
- .at matches any three-character string ending with «at», including «hat«, «cat«, and «bat«.
- [hc]at matches «hat» and «cat«.
- [^b]at matches all strings matched by .at except «bat«.
- ^[hc]at matches «hat» and «cat«, but only at the beginning of the string or line.
- [hc]at$ matches «hat» and «cat«, but only at the end of the string or line.
- \[.\] matches any single character surrounded by «[» and «]» since the brackets are escaped, for example: «[a]» and «[b]«.
Character classes [ edit | edit source ]
The POSIX standard defines some classes or categories of characters as shown below. These classes are used within brackets.
POSIX class similar to meaning [:upper:] [A-Z] uppercase letters [:lower:] [a-z] lowercase letters [:alpha:] [A-Za-z] upper- and lowercase letters [:digit:] 7 digits [:xdigit:] [0-9A-Fa-f] hexadecimal digits [:alnum:] [A-Za-z0-9] digits, upper- and lowercase letters [:punct:] punctuation (all graphic characters except letters and digits) [:blank:] [ \t] space and TAB characters only [:space:] [ \t\n\r\f\v] blank (whitespace) characters [:cntrl:] control characters [:graph:] [^ [:cntrl:]] graphic characters (all characters which have graphic representation) [:print:] [[:graph:] ] graphic characters and space [:word:] [[:alnum:]_] Alphanumeric characters with underscore character _, meaning alnum + _. It is a perl specific character class. - a[[:digit:]]b matches «a0b«, «a1b«, . «a9b«.
- a[:digit:]b is an error: character classes must be in brackets
- [[:digit:]abc] matches any digit, «a«, «b«, and «c«.
- [abc[:digit:]] is the same as above
- [^ABZ[:lower:]] matches any character except lowercase letters, A, B, and Z.
Collating symbols [ edit | edit source ]
Collating symbols, like character classes, are used in brackets and have the form [.ch.] . Here ch is a digraph. Collating systems are defined by the locale.
Equivalence classes [ edit | edit source ]
Equivalence classes, like character classes and collating symbols, are used in brackets and have the form [=a=] . They stand for any character which is equivalent to the given. According to the standard[1],
For example, if ‘a’, ‘à’, and ‘â’ belong to the same equivalence class, then «[[=a=]b]», «[[=à=]b]», and «[[=â=]b]» are each equivalent to «[aàâb]».
Equivalence classes, like collating symbols, are defined by the locale.
External links [ edit | edit source ]
Use in Tools [ edit | edit source ]
Tools and languages that utilize this regular expression syntax include: