sed & awk / sed & awk: 5.3 Замена

Оглавление
← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

Мы уже продемонстрировали множество методов испольлзования команды замены. Давайте внимательно посмотрим на синтаксис:

r0mk 14.02.13 в 11:20

0

[address]s/pattern/replacement/flags

r0mk 14.02.13 в 11:20

0

где флаг, изменяющий замену:

r0mk 15.02.13 в 04:42

0

n число (от 1 до 512) говорит, что замена должна быть сделана только для n вхождений шаблона.

r0mk 15.02.13 в 04:43

0

g производит изменения глобально для всех вхождений в рабочей области. Обычно только первое вхождение заменяется.

r0mk 15.02.13 в 04:44

0

р печатает содержание рабочей области.

r0mk 15.02.13 в 04:44

0

w file запишет содержимое рабочей области в файл

r0mk 15.02.13 в 04:45

0

Команда замены применяется к строкам, удовлетворяющим адресу. Если адрес не указан, она применяется ко всем строкам удовлетворяющим шаблону регулярного выражения. Если регулярное выражение поставлено в качестве адреса и шаблон не указан, то команда замены найдет то, что указано в адресе. Это может быть удобно, когда команда замены одна из множества команд, применяемых по одному адресу. Для пример, посмотрите раздел "проверка страницы ссылок" позже в этой главе.

r0mk 15.02.13 в 04:49

0

В отличии от адресов, которые требует слэш (\) в качестве разделителя, регулярное выражение может быть разделено любым символом кроме новой строки. Таким образом, если шаблон содержит слэши, следует выбрать другой символ, например восклицательный знак, в качестве разделителя.

r0mk 22.02.13 в 09:45

0

s!/usr/mail!/usr2/mail!

r0mk 22.02.13 в 09:45

0

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

r0mk 22.02.13 в 09:48

0

Когда-то, компьютеры хранили текст в записях фиксированной длины. Строка заканчивалась после некоторого количества символов (обычно 80) и затем продалжалась с новой строки. Небыло точного символа для обозначения конца строки и начала следующей; каждая строка имела одно и тоже (фиксированное) количество символов. Новые системы более гибкие; они используют специальный символ (называемый новая строка) для обозначения конца строки. Это позволяет строкам быть произвольной[3] длины.

r0mk 25.02.13 в 05:54

0

[3] Более или менее. Многие UNIX программы имеют внутреннее ограничение для обрабатываемую длину строки. Большинство GNU програм, однако, не имеют таких ограничений.

r0mk 25.02.13 в 05:59

0

С тех пор как новая строка это просто символ, который содержится внутри, регулярное выражение может использовать "\n" для соответствия встроенной новой строки. Это встречается, как Вы увидете в следующей главе, в отдельных случаях, когда другая строка добавлена к текущей строке в рабочей области. ( См. Глава 2, Понимание базовых операций, для обсуждения адресации и Глава 3, Понимание синтаксиса регулярных выражений, для обсуждения синтаксиса регулярных выражений.)

r0mk 25.02.13 в 06:07

0

Замещение это строка символов, которая будет заменена тем, что соответствует регулярному выражению. ( См. раздел "Степень соответствия" в Главе 3.) В части замены только следующие символы имеют особое значение:

r0mk 25.02.13 в 06:10

0

& Заменено на строку, соответствующей регулярному выражению.

r0mk 25.02.13 в 06:10

0

\n Соответствует n подстрок ( где n цифра) ранее указанных в шаблоне используя "\(" и "\)"/

r0mk 26.02.13 в 04:25

0

\ используется для исключения ампексенда (&), обратного слеша и разделителя команд подстановки, когда они используются буквально в разделе замены. В дополнение, он может использоваться для экранирования переноса строки и создания многострочной замены.

r0mk 28.02.13 в 12:51

0

Таким образом, помимо спецсимволов в регулярном выражении sed использует спецсимволы в заменах. См. следующий раздел "Спецсимволы замены", для примеров их использования..

r0mk 28.02.13 в 12:53

0

Флаги могут использоваться совместно, где этог существенно. Для примера gp производит подстановку глобально на строки и печатает эту строку. Флаг глобальности является наиболее используемым. Без него замена осуществляется только для первого вхождения в строке. Флаг печати и флаг записи оба предоставляют одинаковый функционал как и команды print и write( которые обсудим позже в главе) с одним важным отличием. Эти действия зависят от успешности поисходящего замещения. Другими словами, если замена сделана, то строка печатается или пишется в файл. Поскольку стандартное действие проходит по всем строкам, независимо от действия, флаги print и write обычно используются, когда подавляется стандартный вывод( опция -n). В дополнение, если скрипт содержит множественные команды замены, удовлетворяющие одной строке, то и множество копий этой строки будет напечатано или записано в файл.

r0mk 28.02.13 в 13:05

0

Цифровые флаги могут использоваться в редких случаях, где регулярное выражение повторяется для строки и замена должна быть сделана только для одного вхождения на определенной позиции. Для примера, строка может содержать множественные табуляции. Давайте скажем, что три табуляции на строке и Вы хотите заменить вторую табуляцию на ">". Следующая команда замены сделает это:

r0mk 28.02.13 в 13:10

0

s//>/2

r0mk 28.02.13 в 13:10

0

"" представляет символ табуляции, иначе невидим на экране. Если входной однострочный файл будет таким:

r0mk 28.02.13 в 13:13

0

Column1Column2Column3Column4

r0mk 28.02.13 в 13:13

0

произведенный вывод после запуска скрипта на этом файле будет:

r0mk 28.02.13 в 13:14

0

Column1Column2>Column3Column4

r0mk 28.02.13 в 13:14

0

Запомните, что без числового флага команда заменит только первую табуляцию. (Таким образом, "1" может считаться числовым флагом по-умолчанию)

r0mk 27.03.13 в 07:42

0

5.3.1 Спецсимволы замены.

r0mk 27.03.13 в 07:42

0

Символы подстановки бэкслеш (\), амперсенд (&) и \n. Бэкслеш в основном используется для исключения других спецсимволом и для переноса строки в заменяемой строке.

r0mk 04.09.13 в 06:08

0

Мы можем сделать версию прошлого примера с заметой второй табуляции на каждонй строке на новую строку.

r0mk 04.09.13 в 06:09

0

s//\

r0mk 04.09.13 в 06:09

0

/2

r0mk 04.09.13 в 06:09

0

Обратите внимание, что нельзя ставить пробелы после бэкслеша. Этот скрипт производит следующий результат:

r0mk 04.09.13 в 06:10

0

Column1Column2

r0mk 04.09.13 в 06:10

0

Column3Column4

r0mk 04.09.13 в 06:10

0

Следеющий пример для приобразования файла для troff в формат ASCII для Ventura Publisher. Он преобразует следующую строку troff:

r0mk 04.09.13 в 06:12

0

.Ah "Major Heading"

r0mk 04.09.13 в 06:12

0

в аналогичную строку для Ventura Publisher:

r0mk 04.09.13 в 06:12

0

@A HEAD = Major Heading

r0mk 04.09.13 в 06:12

0
Минутку...

Следующая страница →