Учебники

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

Именно регулярные выражения делают SED мощным и эффективным. Ряд сложных задач можно решить с помощью регулярных выражений. Любой эксперт командной строки знает силу регулярных выражений.

Как и многие другие утилиты GNU / Linux, SED также поддерживает регулярные выражения, которые часто называют регулярными выражениями . Эта глава подробно описывает регулярные выражения. Глава разделена на три раздела: стандартные регулярные выражения, классы регулярных выражений POSIX и мета-символы.

Стандартные регулярные выражения

Начало строки (^)

В терминологии регулярных выражений символ каретки (^) соответствует началу строки. В следующем примере печатаются все строки, начинающиеся с шаблона «The».

[jerry]$ sed -n '/^The/ p' books.txt

Выполнив приведенный выше код, вы получите следующий результат:

 Две башни, Дж. Р. Р. Толкиен 
 Алхимик Пауло Коэльо 
 Братство Кольца, JRR Толкиен 
 Паломничество, Пауло Коэльо

Конец строки ($)

Конец строки представлен символом доллара ($). В следующем примере печатаются строки, оканчивающиеся на «Coelho».

[jerry]$ sed -n '/Coelho$/ p' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 Алхимик Пауло Коэльо 
 Паломничество, Пауло Коэльо

Один символ (.)

Точка (.) Соответствует любому отдельному символу, кроме символа конца строки. В следующем примере печатаются все трехбуквенные слова, заканчивающиеся символом «t».

[jerry]$ echo -e "cat\nbat\nrat\nmat\nbatting\nrats\nmats" | sed -n '/^..t$/p' 

Выполнив приведенный выше код, вы получите следующий результат:

 кошка 
 летучая мышь 
 крыса 
 мат

Совпадение символов ([])

В терминологии регулярных выражений набор символов представлен квадратными скобками ([]). Используется для соответствия только одному из нескольких символов. В следующем примере сопоставляются шаблоны «Call» и «Tall», но не «Ball».

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[CT]all/ p'

Выполнив приведенный выше код, вы получите следующий результат:

 Вызов 
 высокий

Эксклюзивный набор ([^])

В эксклюзивном наборе каретка отменяет набор символов в квадратных скобках. В следующем примере печатается только «Ball».

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/ p'

Выполнив приведенный выше код, вы получите следующий результат:

 Мяч 

Диапазон символов ([-])

Если указан диапазон символов, регулярное выражение соответствует любому символу в диапазоне, указанном в квадратных скобках. Следующий пример соответствует «Call» и «Tall», но не «Ball».

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/ p' 

Выполнив приведенный выше код, вы получите следующий результат:

 Вызов 
 высокий

Теперь давайте изменим диапазон на «AP» и посмотрим на результат.

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[A-P]all/ p' 

Выполнив приведенный выше код, вы получите следующий результат:

 Вызов 
 Мяч

Ноль на одно вхождение (\?)

В SED знак вопроса (\?) Соответствует нулю или одному вхождению предшествующего символа. Следующий пример соответствует «Поведению», а также «Поведению». Здесь мы сделали «u» необязательным символом, используя «\?».

[jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/ p' 

Выполнив приведенный выше код, вы получите следующий результат:

 Поведение 
 Поведение

Одно или несколько вхождений (\ +)

В SED символ плюс (\ +) соответствует одному или нескольким вхождениям предыдущего символа. В следующем примере показано одно или несколько вхождений «2».

[jerry]$ echo -e "111\n22\n123\n234\n456\n222"  | sed -n '/2\+/ p'

Выполнив приведенный выше код, вы получите следующий результат:

 22 
 123 
 234 
 222 

Ноль или более вхождение (*)

Звездочки (*) соответствуют нулю или более вхождению предыдущего символа. Следующий пример соответствует «ca», «cat», «catt» и так далее.

[jerry]$ echo -e "ca\ncat" | sed -n '/cat*/ p' 

Выполнив приведенный выше код, вы получите следующий результат:

 Калифорния 
 кошка 

Точно N вхождений {n}

{n} точно соответствует «n» вхождению предыдущего символа. В следующем примере печатаются только трехзначные числа. Но перед этим вам нужно создать следующий файл, который содержит только цифры.

[jerry]$ cat numbers.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 1 
 10 
 100 
 1000 
 10000 
 100000 
 1000000 
 10000000 
 100000000 
 1000000000

Давайте напишем выражение SED.

[jerry]$ sed -n '/^[0-9]\{3\}$/ p' numbers.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 100

Обратите внимание, что пара фигурных скобок экранируется символом «\».

По крайней мере, n вхождений {n,}

{n,} соответствует как минимум «n» вхождению предыдущего символа. В следующем примере печатаются все числа, большие или равные пяти цифрам.

[jerry]$ sed -n '/^[0-9]\{5,\}$/ p' numbers.txt

Выполнив приведенный выше код, вы получите следующий результат:

 10000 
 100000 
 1000000
 10000000 
 100000000 
 1000000000 

M к N Вхождение {m, n}

{m, n} соответствует как минимум «m» и не более «n» вхождений предыдущего символа. В следующем примере печатаются все числа, имеющие не менее пяти цифр, но не более восьми цифр.

[jerry]$ sed -n '/^[0-9]\{5,8\}$/ p' numbers.txt

Выполнив приведенный выше код, вы получите следующий результат:

 10000 
 100000 
 1000000 
 10000000 

Труба (|)

В SED символ канала ведет себя как логическая операция ИЛИ. Это соответствует пунктам с любой стороны трубы. Следующий пример соответствует либо «str1», либо «str3».

[jerry]$ echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/ p' 

Выполнив приведенный выше код, вы получите следующий результат:

 str1 
 str3

Обратите внимание, что пара скобок и pipe (|) экранируются символом «\».

Убегающие персонажи

Есть определенные специальные символы. Например, символ новой строки представлен символом «\ n», возврат каретки представлен символом «\ r» и т. Д. Чтобы использовать эти символы в обычном контексте ASCII, мы должны экранировать их, используя символ обратной косой черты (\). Эта глава иллюстрирует экранирование специальных символов.

Спасаясь «\»

Следующий пример соответствует шаблону «\».

[jerry]$ echo 'str1\str2' | sed -n '/\\/ p'

Выполнив приведенный выше код, вы получите следующий результат:

 str1 \ str2 

Экранирование «\ n»

Следующий пример соответствует символу новой строки.

[jerry]$ echo 'str1\nstr2' | sed -n '/\\n/ p'

Выполнив приведенный выше код, вы получите следующий результат:

 str1 \ nstr2

Бегство «г»

Следующий пример соответствует возврату каретки.

[jerry]$ echo 'str1\rstr2' | sed -n '/\\r/ p'

Выполнив приведенный выше код, вы получите следующий результат:

 str1 \ rstr2

Бегство «\ dnnn»

Это соответствует символу, десятичное значение ASCII которого равно «nnn». В следующем примере соответствует только символ «а».

[jerry]$ echo -e "a\nb\nc" | sed -n '/\d97/ p'

Выполнив приведенный выше код, вы получите следующий результат:


Бегство «\ onnn»

Это соответствует символу, восьмеричное значение ASCII которого равно «nnn». Следующий пример соответствует только символу «b».

[jerry]$ echo -e "a\nb\nc" | sed -n '/\o142/ p' 

Выполнив приведенный выше код, вы получите следующий результат:

 б 

Это соответствует символу, шестнадцатеричное значение ASCII которого равно «nnn». Следующий пример соответствует только символу «c».

[jerry]$ echo -e "a\nb\nc" | sed -n '/\x63/ p'

Выполнив приведенный выше код, вы получите следующий результат:

 с

POSIX классы регулярных выражений

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

[Цифра, буква]

Это подразумевает алфавитные и числовые символы. В следующем примере сопоставляются только «Один» и «123», но не соответствует символу табуляции.

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alnum:]]/ p'

Выполнив приведенный выше код, вы получите следующий результат:

 Один 
 123

[:альфа:]

Это подразумевает только алфавитные символы. Следующий пример соответствует только слову «Один».

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alpha:]]/ p'

Выполнив приведенный выше код, вы получите следующий результат:

 Один 

[: Пусто:]

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

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:space:]]/ p' | cat -vte

Выполнив приведенный выше код, вы получите следующий результат:

 ^ I $

Обратите внимание, что команда «cat -vte» используется для отображения символов табуляции (^ I).

[: Цифры:]

Это подразумевает только десятичные числа. В следующем примере соответствует только цифра «123».

[jerry]$ echo -e "abc\n123\n\t" | sed -n '/[[:digit:]]/ p' 

Выполнив приведенный выше код, вы получите следующий результат:

 123 

[: Нижняя:]

Это подразумевает только строчные буквы. В следующем примере соответствует только «один».

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:lower:]]/ p' 

Выполнив приведенный выше код, вы получите следующий результат:

 один 

[: Верхняя:]

Это подразумевает только заглавные буквы. Следующий пример соответствует только «ДВА».

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:upper:]]/ p'

Выполнив приведенный выше код, вы получите следующий результат:

 ДВА

[Пунктуатор]

Это подразумевает знаки препинания, которые включают не пробелы или буквенно-цифровые символы

[jerry]$ echo -e "One,Two\nThree\nFour" | sed -n '/[[:punct:]]/ p'

Выполнив приведенный выше код, вы получите следующий результат:

 Один два

[:пространство:]

Это подразумевает пробельные символы. Следующий пример иллюстрирует это.

[jerry]$ echo -e "One\n123\f\t" | sed -n '/[[:space:]]/ p' | cat -vte 

Выполнив приведенный выше код, вы получите следующий результат:

 123 ^ L ^ I $ 

метасимволов

Как и традиционные регулярные выражения, SED также поддерживает метасимволы. Это регулярные выражения в стиле Perl. Обратите внимание, что поддержка метасимволов специфична для GNU SED и может не работать с другими вариантами SED. Давайте обсудим метасимволы в деталях.

Граница слова (\ b)

В терминологии регулярных выражений «\ b» соответствует границе слова. Например, «\ bthe \ b» соответствует «the», но не «this», «there», «они», «then» и т. Д. Следующий пример иллюстрирует это.

[jerry]$ echo -e "these\nthe\nthey\nthen" | sed -n '/\bthe\b/ p'

Выполнив приведенный выше код, вы получите следующий результат:


Граница без слов (\ B)

В терминологии регулярных выражений «\ B» соответствует границе без слов. Например, «\ B» соответствует «этим» и «они», но не «the». Следующий пример иллюстрирует это.

[jerry]$ echo -e "these\nthe\nthey" | sed -n '/the\B/ p'

Выполнив приведенный выше код, вы получите следующий результат:

 эти 
 Oни

Один пробел (\ s)

В SED «\ s» подразумевает один символ пробела. Следующий пример соответствует «Line \ t1», но не соответствует «Line1».

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\s/ p'

Выполнив приведенный выше код, вы получите следующий результат:

 Строка 1 

Одноместный без пробелов (\ S)

В SED «\ S» подразумевает один символ пробела. Следующий пример соответствует «Line2», но не соответствует «Line \ t1».

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\S/ p' 

Выполнив приведенный выше код, вы получите следующий результат:

 Line2

Отдельное слово (\ w)

В SED «\ w» подразумевает символ из одного слова, то есть буквенные символы, цифры и подчеркивание (_). Следующий пример иллюстрирует это.

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\w/ p'

Выполнив приведенный выше код, вы получите следующий результат:

 Один 
 123 
 1_2

Одиночный не-словесный символ (\ W)

В SED «\ W» подразумевает один несловарный символ, который в точности противоположен «\ w». Следующий пример иллюстрирует это.

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\W/ p'

Выполнив приведенный выше код, вы получите следующий результат:

 &; #

Начало шаблона пространства (\ `)

В SED «\` «подразумевает начало пространства образца. Следующий пример соответствует только слову «Один».

[jerry]$ echo -e "One\nTwo One" | sed -n '/\`One/ p' 

Выполнив приведенный выше код, вы получите следующий результат: