sed & awk / sed & awk: 5.3 Замена
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Мы уже продемонстрировали множество методов испольлзования команды замены. Давайте внимательно посмотрим на синтаксис: r0mk 14.02.13 в 11:20 |
|
|
[address]s/pattern/replacement/flags r0mk 14.02.13 в 11:20 |
||
|
где флаг, изменяющий замену: r0mk 15.02.13 в 04:42 |
||
|
n число (от 1 до 512) говорит, что замена должна быть сделана только для n вхождений шаблона. r0mk 15.02.13 в 04:43 |
||
|
g производит изменения глобально для всех вхождений в рабочей области. Обычно только первое вхождение заменяется. r0mk 15.02.13 в 04:44 |
||
|
р печатает содержание рабочей области. r0mk 15.02.13 в 04:44 |
||
|
w file запишет содержимое рабочей области в файл r0mk 15.02.13 в 04:45 |
||
|
Команда замены применяется к строкам, удовлетворяющим адресу. Если адрес не указан, она применяется ко всем строкам удовлетворяющим шаблону регулярного выражения. Если регулярное выражение поставлено в качестве адреса и шаблон не указан, то команда замены найдет то, что указано в адресе. Это может быть удобно, когда команда замены одна из множества команд, применяемых по одному адресу. Для пример, посмотрите раздел "проверка страницы ссылок" позже в этой главе. r0mk 15.02.13 в 04:49 |
||
|
В отличии от адресов, которые требует слэш (\) в качестве разделителя, регулярное выражение может быть разделено любым символом кроме новой строки. Таким образом, если шаблон содержит слэши, следует выбрать другой символ, например восклицательный знак, в качестве разделителя. r0mk 22.02.13 в 09:45 |
||
|
s!/usr/mail!/usr2/mail! r0mk 22.02.13 в 09:45 |
||
|
Обратите внимание, что разделитель встречается три раза и требуется после замены. В независимости от того, какой разделитель используется, если он встречается в регулярном выражении или в заменяемом тексте используйте обратный слэш для исключения его. r0mk 22.02.13 в 09:48 |
||
|
Когда-то, компьютеры хранили текст в записях фиксированной длины. Строка заканчивалась после некоторого количества символов (обычно 80) и затем продалжалась с новой строки. Небыло точного символа для обозначения конца строки и начала следующей; каждая строка имела одно и тоже (фиксированное) количество символов. Новые системы более гибкие; они используют специальный символ (называемый новая строка) для обозначения конца строки. Это позволяет строкам быть произвольной[3] длины. r0mk 25.02.13 в 05:54 |
||
|
[3] Более или менее. Многие UNIX программы имеют внутреннее ограничение для обрабатываемую длину строки. Большинство GNU програм, однако, не имеют таких ограничений. r0mk 25.02.13 в 05:59 |
||
|
С тех пор как новая строка это просто символ, который содержится внутри, регулярное выражение может использовать "\n" для соответствия встроенной новой строки. Это встречается, как Вы увидете в следующей главе, в отдельных случаях, когда другая строка добавлена к текущей строке в рабочей области. ( См. Глава 2, Понимание базовых операций, для обсуждения адресации и Глава 3, Понимание синтаксиса регулярных выражений, для обсуждения синтаксиса регулярных выражений.) r0mk 25.02.13 в 06:07 |
||
|
Замещение это строка символов, которая будет заменена тем, что соответствует регулярному выражению. ( См. раздел "Степень соответствия" в Главе 3.) В части замены только следующие символы имеют особое значение: r0mk 25.02.13 в 06:10 |
||
|
& Заменено на строку, соответствующей регулярному выражению. r0mk 25.02.13 в 06:10 |
||
|
\n Соответствует n подстрок ( где n цифра) ранее указанных в шаблоне используя "\(" и "\)"/ r0mk 26.02.13 в 04:25 |
||
|
\ используется для исключения ампексенда (&), обратного слеша и разделителя команд подстановки, когда они используются буквально в разделе замены. В дополнение, он может использоваться для экранирования переноса строки и создания многострочной замены. r0mk 28.02.13 в 12:51 |
||
|
Таким образом, помимо спецсимволов в регулярном выражении sed использует спецсимволы в заменах. См. следующий раздел "Спецсимволы замены", для примеров их использования.. r0mk 28.02.13 в 12:53 |
||
|
Флаги могут использоваться совместно, где этог существенно. Для примера gp производит подстановку глобально на строки и печатает эту строку. Флаг глобальности является наиболее используемым. Без него замена осуществляется только для первого вхождения в строке. Флаг печати и флаг записи оба предоставляют одинаковый функционал как и команды print и write( которые обсудим позже в главе) с одним важным отличием. Эти действия зависят от успешности поисходящего замещения. Другими словами, если замена сделана, то строка печатается или пишется в файл. Поскольку стандартное действие проходит по всем строкам, независимо от действия, флаги print и write обычно используются, когда подавляется стандартный вывод( опция -n). В дополнение, если скрипт содержит множественные команды замены, удовлетворяющие одной строке, то и множество копий этой строки будет напечатано или записано в файл. r0mk 28.02.13 в 13:05 |
||
|
Цифровые флаги могут использоваться в редких случаях, где регулярное выражение повторяется для строки и замена должна быть сделана только для одного вхождения на определенной позиции. Для примера, строка может содержать множественные табуляции. Давайте скажем, что три табуляции на строке и Вы хотите заменить вторую табуляцию на ">". Следующая команда замены сделает это: r0mk 28.02.13 в 13:10 |
||
|
s//>/2 r0mk 28.02.13 в 13:10 |
||
|
"" представляет символ табуляции, иначе невидим на экране. Если входной однострочный файл будет таким: r0mk 28.02.13 в 13:13 |
||
|
Column1Column2Column3Column4 r0mk 28.02.13 в 13:13 |
||
|
произведенный вывод после запуска скрипта на этом файле будет: r0mk 28.02.13 в 13:14 |
||
|
Column1Column2>Column3Column4 r0mk 28.02.13 в 13:14 |
||
|
Запомните, что без числового флага команда заменит только первую табуляцию. (Таким образом, "1" может считаться числовым флагом по-умолчанию) r0mk 27.03.13 в 07:42 |
||
|
5.3.1 Спецсимволы замены. r0mk 27.03.13 в 07:42 |
||
|
Символы подстановки бэкслеш (\), амперсенд (&) и \n. Бэкслеш в основном используется для исключения других спецсимволом и для переноса строки в заменяемой строке. r0mk 04.09.13 в 06:08 |
||
|
Мы можем сделать версию прошлого примера с заметой второй табуляции на каждонй строке на новую строку. r0mk 04.09.13 в 06:09 |
||
|
s//\ r0mk 04.09.13 в 06:09 |
||
|
/2 r0mk 04.09.13 в 06:09 |
||
|
Обратите внимание, что нельзя ставить пробелы после бэкслеша. Этот скрипт производит следующий результат: r0mk 04.09.13 в 06:10 |
||
|
Column1Column2 r0mk 04.09.13 в 06:10 |
||
|
Column3Column4 r0mk 04.09.13 в 06:10 |
||
|
Следеющий пример для приобразования файла для troff в формат ASCII для Ventura Publisher. Он преобразует следующую строку troff: r0mk 04.09.13 в 06:12 |
||
|
.Ah "Major Heading" r0mk 04.09.13 в 06:12 |
||
|
в аналогичную строку для Ventura Publisher: r0mk 04.09.13 в 06:12 |
||
|
@A HEAD = Major Heading r0mk 04.09.13 в 06:12 |
||
