sed & awk / sed & awk: 3.2 Наборы символов
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Мы имеем два базовых элемента выражения: r0mk 18.10.12 в 10:15 |
|
|
1. Значение, выраженнное буквально или переменная r0mk 18.10.12 в 10:16 |
||
|
2. Оператор r0mk 18.10.12 в 10:16 |
||
|
Регулярное выражение состоит из тех же элементов. Любой символ, исключая спецсимволы из таблицы 3.1 интерпретируется буквально и удовлетворяеттолько самому себе. r0mk 18.10.12 в 10:17 |
||
|
Значения спецсимволов r0mk 18.10.12 в 10:19 |
||
|
. Удовлетворяет любому одиночному символу, исключая новую строку. В awk, точка может также удовлетворять и новой строке. r0mk 18.10.12 в 10:44 |
||
|
* Удовлетворяет любому количеству (включая ноль) одиночных символом ( включая символы указанные в регулярном выражении) которе непосредственно предшествуют. r0mk 18.10.12 в 10:47 |
||
|
[...] Удовлетворяет любому классу символом в скобках. Символ (^) как первый символ внутри скобок меняет условие совпадения для всех символов, кроме новой строки и перечисленных в классе. В awk, новая строка также удовлетворяет. Дефис (-) используется для задания диапозона символов. Закрывающуяся скобка (]), как первый символ в классе, будет частью класса. Все остальные спецсимволы теряют свое значение, когда указан член класса. r0mk 18.10.12 в 10:54 |
||
|
^ Первый символ регулярного выражения, удовлетворяет началу строки. Удовлетворяет началу строки в awk, даже если строка содержит перевод строки. r0mk 18.10.12 в 10:56 |
||
|
$ как символ регулряного выражения, удовлетворяет концу строки. Удовлетворяет концу строки в awk, даже если содержит окончание строки. r0mk 18.10.12 в 10:57 |
||
|
\{n,m\} Удовлетворяет дипозону вхождений одиночных символов ( включая символы регулярных выражений) которые ему предшествуют. \{n\} будет соответствовать только n, \{n,\} ,будет соответстовать по крайней мере n событий, и \{n,m\} будет соответствовать любому числу вхождений между n и m. (sed и grep не будут в очень старых версиях.) r0mk 18.10.12 в 11:33 |
||
|
\ Эскейп, спецсимвол, который описан ниже. r0mk 18.10.12 в 11:21 |
||
|
Таблица 3.1 Обзор спецсимволов r0mk 18.10.12 в 11:33 |
||
|
Расширенные символы (egrep и awk) r0mk 18.10.12 в 11:36 |
||
|
Значения спецсимволов r0mk 18.10.12 в 11:37 |
||
|
+ Удовлетворяет одному или нескольким вхождениям предыдущего регулярного выражения r0mk 23.10.12 в 06:40 |
||
|
? Удовлетворяет нулю или нескольким вхождениям предыдущего регулярного выражения r0mk 23.10.12 в 06:40 |
||
|
| Указывает на то, что совпадение может быть как до, так и после регулярного выражения(чередование). r0mk 23.10.12 в 06:43 |
||
|
() Группы регулярных выражений. r0mk 18.10.12 в 13:06 |
||
|
{n,m} Удовлетворяет диапозону вхождений одного символа (включая символ заданный в регулярном выражении) который ему непосредственно предшествует. {n} соответствует числу вхождений, {n,} соответствует, по крайней мере n вхождений, и {n,m} соответствует количеству вхождений между n и m. (POSIX agrep и POSIX awk, не являются традиционными egrep и awk.) [2] r0mk 26.10.12 в 10:53 |
||
|
[2] Большинство awk версий awk не поддерживают этот способ. r0mk 26.10.12 в 11:03 |
||
|
Спецсимволы имеют особое значение в регулярных выражения, так же, как + и * имеют особое значение в арифметических выражениях. Некоторые из спесимволом (+ ? () |) доступны только как часть для расширения параметров, используемых такой программой как egrep и awk. Мы рассмотрим, что каждый спецсимвол делает в следующем разделе, начнем с бэкслеша. r0mk 29.10.12 в 07:36 |
||
|
3.2.1 Вездесущий бэкслеш r0mk 29.10.12 в 07:39 |
||
|
Бэкслеш (\) спецсимвол, преобразующий спецсимвол в обычный символ( и обычный символ в спецсимвол). Он заставляет отрабатывать буквально любой спецсимвол, чак чтобы он соответсвовал только себе самому. Для примера, точка (.) является спецсимволом, который нужно выделить бэкслешем, если Вы хотите найти точку. Это выражение соответствует точке и трем пробелам после. r0mk 29.10.12 в 07:46 |
||
|
\. Бэкслеш обычно используют для troff запроса или макроса, который начинается с точки. r0mk 29.10.12 в 07:48 |
||
|
\.nf С помощью бэкслеша, Вы так же можете исключить бэкслеш. Для примера, смена шрифта в troff "\f". Для происка строк, содержащих запрос, Вы используете следующее выражение: r0mk 29.10.12 в 07:52 |
||
|
\\f В добавление sed использует бэкслеш для вызова группы обычных символов как спецсимволов, как будет показано на таблице 3.2. r0mk 29.10.12 в 07:54 |
||
|
Таблица 3.2: Исключающие спецсимволы в sed r0mk 29.10.12 в 07:55 |
||
|
n в конструкции "\n" представляет цифру от 1 до 9; его использование будет объяснено в Главе 5, Основные команды sed. r0mk 29.10.12 в 07:56 |
||
|
3.2.2 Подстановка r0mk 29.10.12 в 07:57 |
||
|
Подстановка спецсимвола или точки (.) можно прировнять к переменной. Переменная представляет любое значение в арифметическом выражении. В регулярном выражении точка (.) подставляет любой символ, исключая новую строку. ( В awk точка может быть и символом новой строки.) r0mk 01.11.12 в 12:21 |
||
|
Учитывая, что мы можем описывать последовательности символом, подстановка символов позволяет Вам указать позицию, которую любой символ может занимать. r0mk 01.11.12 в 12:22 |
||
|
Для примера, если мы ищем файл, содержащий обсуждение новой линейки микропроцессоров Intel, регулряное выражение будет следующим: r0mk 01.11.12 в 12:24 |
||
|
80.86 r0mk 01.11.12 в 12:24 |
||
|
будут соответствовать строки, содержащие ссылки на "80286," "80386," или "80486."[3] Для поиска точки, Вам следует перед точкой поставить бэкслеш. r0mk 01.11.12 в 12:26 |
||
|
Линейка микропроцессоров Pentium нарушает наши простые поисковые эксперименты и портит веселие. Не говоря уже о оригинальном 8086. r0mk 01.11.12 в 12:28 |
||
|
Это редко бывает полезно для соответствия любому символу в начале или конце шаблона. Таким образом подстановочный символ предшествует или следует после обысного символа или спецсимвола. Для примера, регулряное выражение может быть написано для поиска ссылки на главу: r0mk 01.11.12 в 12:42 |
||
|
Chapter. r0mk 01.11.12 в 12:42 |
||
|
Они ищет "строку 'Chapter' с любым последующим символом." В поиске это выражение может оказаться таким же как и фиксированная строка "Chapter". Рассмотрим следующий пример: r0mk 01.11.12 в 12:46 |
||
|
$ grep 'Chapter.' sample r0mk 01.11.12 в 12:46 |
||
|
you will find several examples in Chapter 9. r0mk 01.11.12 в 12:47 |
||
|
"Quote me 'Chapter and Verse'," she said. r0mk 01.11.12 в 12:47 |
||
|
Chapter Ten r0mk 01.11.12 в 12:48 |
||
|
Поисковая строка "Chapter" сопоставляется с "Chapter." будет соответствовать тем же строкам. Как правило в одном случае они будут разными - если "Chapter" будет в конце строки. Подстановка не соответствует новой строке, таким образом "Chapter." не будет соответствовать этой строк,хотя фиксированный шаблон будет. r0mk 01.11.12 в 12:52 |
||
|
3.2.3 Написание регулярных выражений r0mk 01.11.12 в 12:52 |
||
|
Для всех практических целей, Вы можете положиться на программу, для получения желаемого результата. Как правило, это не означает, что программа всегда работает правильно, насколько бы вы хотели. В большинстве случаем, Вы можете полажиться на то, что если программа не выдает ожидаемый результат, то в действительности проблема (исключая ошибка ввода и синтаксические ошибки), в том как Вы описали желаемый результат. r0mk 09.11.12 в 11:21 |
||
|
Другими словами, местом для исправления проблемы, будет выражение в котором Вы описываете желаемый результат. Или выражение неокончено или неправильно сформировано. Для примера, если программа обработает это выражение: r0mk 09.11.12 в 11:23 |
||
|
PAY = WEEKLY_SALARY * 52 r0mk 09.11.12 в 11:23 |
||
|
и зная значения этих переменных, она расчитает правильный результат. Но кто-то может возразить, что формула не учитывает продавцов, которые также получают комиссию. Для объяснения этого примера, выражение должно быть сформулировано так: r0mk 09.11.12 в 11:27 |
||
|
PAY = WEEKLY_SALARY * 52 + COMMISSION r0mk 09.11.12 в 11:27 |
