====== Регулярные выражения ======
* [[https://youtu.be/BhbDsKetNn8|Видео: Про регулярные выражения]]
$ man re_format
$ man regex
* [[http://ru.wikipedia.org/wiki/Регулярное_выражение|Регулярное выражение]]
* [[http://www.ibm.com/developerworks/ru/library/l-regexp_1/|Секреты регулярных выражений]]
* [[Команды фильтры#grep]]
===== Символы базовых регулярных выражений =====
==== Символ -- ^ -- ====
Означает начало строки, но иногда, в зависимости от контекста, означает отрицание в регулярных выражениях.
$ grep '^s' /etc/passwd
sshd:*:22:22:Secure Shell Daemon:/var/empty:/usr/sbin/nologin
smmsp:*:25:25:Sendmail Submission User:/var/spool/clientmqueue:/usr/sbin/nologin
==== Знак доллара -- $ -- ====
В конце регулярного выражения соответствует концу строки.
$ grep 'sh$' /etc/passwd
==== Квадратные скобки -- [...] -- ====
Предназначены для задания подмножества символов. Квадратные скобки, внутри регулярного выражения, считаются одним символом, который может принимать значения, перечисленные внутри этих скобок. Метасимвол ^ означает отрицание множества
$ grep '^[rs]' /etc/passwd
==== Обратный слеш -- \ -- ====
Служит для экранирования специальных символов, это означает, что экранированные символы должны интерпретироваться буквально, т.е. как простые символы (в некоторых случаях наоборот).
echo 172.16.10.254 gate.isp10.un >> /etc/hosts
grep -r "172\.16\.1\." /etc
==== Экранированные "угловые скобки" -- \<...\> -- ====
Отмечают границы слова (не работает в sed).
grep -R '\' /usr/share
==== Звездочка -- * -- ====
Означает любое количество символа в строке, предшествующего "звездочке", в том числе и нулевое число символов.
==== Точка -- . -- ====
Означает один любой символ
==== Экранированные "круглые скобки" -- \( \) -- ====
Предназначены для выделения групп регулярных выражений. Они полезны при использовании с оператором "\|" и при извлечении подстроки.
$ cat catalog.txt
petrof ivan 234-56-78
ivanof sidor 214-56-78
$ sed 's/\(.*\) .* \(.*\)/\1 \2/' catalog.txt
==== Экранированные "фигурные скобки" -- \{ \} -- ====
Задают число вхождений предыдущего выражения.
$ grep '\(ro.*\)\{2\}' /etc/passwd
root:*:0:0:Charlie &:/root:/bin/csh
daemon:*:1:1:Owner of many system processes:/root:/usr/sbin/nologin
===== Классы символов POSIX =====
alnum alpha ascii blank cntrl digit graph lower
print punct space upper word xdigit
Заменяем в файле catalog.txt некоторые пробелы на TAB
$ sed 's/\(.*\)[[:space:]].*[[:space:]]\(.*\)/\1 \2/' catalog.txt
petrof 234-56-78
ivanof 214-56-78
===== Символы расширенных регулярных выражений =====
Многие символы экранируемые в базовых выражениях -- () {} | -- но не -- <> -- используются без экранирования.
==== Знак вопроса -- ? -- ====
Означает, что предыдущий символ или регулярное выражение встречается 0 или 1 раз.
$ grep -E '^r?o' /etc/passwd
root:*:0:0:Charlie &:/root:/bin/csh
operator:*:2:5:System &:/:/usr/sbin/nologin
==== Знак "плюс" -- + -- ====
Указывает на то, что предыдущий символ или выражение встречается 1 или более раз (добавляем произвольное количество символов разделителей в файл catalog.txt).
$ sed -E 's/([[:alnum:]]+)[[:space:]]+[[:alnum:]]+[[:space:]]+([[:alnum:]]+)/\1 \2/' catalog.txt
petrof 234-56-78
ivanof 214-56-78