Готовый перевод sed & awk / sed & awk: 4.2 Глобальный взгляд на адресацию

Внимание! Этот перевод, возможно, ещё не готов, так как модераторы установили для него статус «перевод редактируется»

Одна из первых вещей, которые узнаете, это то, что команды sed применяются ко всем входным строкам. Sed безоговорочно работает глобально, в отличии от ed, ex или vi. Следующая подстановка заменить каждое "CA" на "California" .

s/CA/California/g

Если похожую команду ввести в командную строку ex в vi, он произведет замену для всех вхождений только в текущей строке. В sed, каждая строка попадает в очередь на становление текущей строкой и таким образом команды применяются к каждой строке. Адрес строки используется для подачи контекста, или запрещения, операции. ( В общем: Ничего не будет сделано в vi, до тех пор, пока не укажите все обрабатываемые строки, в то время как sed работает с каждой строкой, до тех пор пока его не остановишь). Для примера, подстановка адреса "Sebastopol" в предыдущую команду замены, можно ограничить замену "CA" на "California" только строками содержащими "Sebastopol".

/Sebastopol/s/CA/California/g

Входные строки содержащие "Sebastopol, CA" будут удовлетворять адресу и команда замены будет применена, заменяя их на "Sebastopol, California". Строка содержащая "San Francisco, CA" не подойдет и замена не будет применена.

В команде sed может быть указано ноль, одни или два адреса. Адрес может быть регулярным выражением, описывающим шаблон, номером строки или символом адресации в строке.

Если адрес не указан, тогда команда будет применена ко всем строкам.

Если указан только один адрес, команда применится к любой строке удовлетворяющей адресу.

Если два разделенных запятой адреса будут указаны, команда выполнится на первой строке удовлетворяющей первому адресу и все следующие подходящие строки включая строки удовлетворяющие второму адресу.

Если перед адресом стоит восклицательный знак (!), команда применится ко всем строкам не удовлетворяющим адресу.

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

d

Когда номер строки указан в качестве адреса, команда применится только к этой строке. Для примера, следущией пример удалит только первую строку:

1d

Номер строки относится к внутреннему счетчику, поддерживаемому sed. Счетчик не сбрасывается при множественных входных файлах. Таким образом, не важно, как много файлов указано на входе, будет только однас строка 1 во входном потоке.

Подобным образом, во входном потоке только одна последняя строка. Она может быть указана с помощью символа адресации $. Следующий пример удаляет последнюю строку входного файла:

$d

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

Когда регулярное выражение обрабатывается как адрес, команда применяется только на строках удовлетворяющих шаблону. Регулярное выражение должно быть выделено слэшами (/). Следующая команда удаления

/^$/d

удалит только пустные строки. Все остальные строки останутся нетронутыми.

Если указать два адреса, тогда Вы укажите диапозон строк на которых команда применяется. Следующий пример показывает как удалить все строки ограниченные парой макросов, в данном случае .TS и .TE, отмеченных знаком табулицы.

/^\.TS/,/^\.TE/d

Удалит все строки удовлетворяющие первому шаблону и до второго шаблона включительно. Строки за пределами диапозона затронуты не будут. Следующая команда удалит строки с 50 до конца файла:

50,$d

Можно смешивать адрес строки и адрес шаблона:

1,/^$/d

Этот пример удали все с первой строки до первой пустрой строки, которая, для примера, удалит почтоый заголовок из интернет письма, сохраненного в файл.

Может показаться, что первый адрес применяет действие и второй адрес отменяет его. Sed никогда не смотрит вперед для проверки будет ли второй шаблон найден. Действие будет применено к строкам, даже после первого совпадения. Команда будет применена ко всей последовательности строк до второго совпадения. В предыдущем примере, если файл не содержит пустой строки, то все строки будут удалены.

Восклицательный знак (!) следующий за адресом инвертирует значение шаблона. Для примера, следующий скрипт удалит все строки, исключая строки внутри таблицы:

/^\.TS/,/^\.TE/!d

Этот скрипт, фактически, извлекает таблицу из исходного файла.

4.2.1 Группировка команд

Скобки ({}) использутся в sed для вкладки одного адреса внутри другого или применения нескольких команд к одному адресу. Можно вкладывать адреса, если хотите указать диапазон строк, а затем, в пределах этого диапазона, укажите другой адрес. Для примера, для удаления пустых строк только внутри блока таблицы, используется следующая команда:

/^\.TS/,/^\.TE/{

/^$/d

}

Открывающаяся фигурная скобка должна быть в конце строки и закрывающаяся фигурная скобка должна быть на новой строке. Убедитесь в отсутствкии пробелов после скобок.

Можно применить несколько команд к одному диапозону строк, включая команды редактирования в скобках, как показано далее:

/^\.TS/,/^\.TE/{

/^$/d

s/^\.ps 10/.ps 8/

s/^\.vs 12/.vs 10/

}

Этот пример не только удаляет пустые строки в таблице, но и так же использует команду замены, s, для изменения некоторых запросов troff. Эта команда применяется только к строка в блоке .TS/.TE.

Внимание! Этот перевод, возможно, ещё не готов.
Его статус: перевод редактируется

Переведено на Нотабеноиде
http://notabenoid.org/book/32181/117186

Переводчики: r0mk

Настройки

Готово:

100.00% КП = 1.0