Именно регулярные выражения делают 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'
Выполнив приведенный выше код, вы получите следующий результат: