====== Регулярные выражения ====== * [[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