sed & awk / sed & awk: 4.2 Глобальный взгляд на адресацию
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Одна из первых вещей, которые узнаете, это то, что команды sed применяются ко всем входным строкам. Sed безоговорочно работает глобально, в отличии от ed, ex или vi. Следующая подстановка заменить каждое "CA" на "California" . r0mk 28.12.12 в 09:41 |
|
|
s/CA/California/g r0mk 28.12.12 в 09:41 |
||
|
Если похожую команду ввести в командную строку ex в vi, он произведет замену для всех вхождений только в текущей строке. В sed, каждая строка попадает в очередь на становление текущей строкой и таким образом команды применяются к каждой строке. Адрес строки используется для подачи контекста, или запрещения, операции. ( В общем: Ничего не будет сделано в vi, до тех пор, пока не укажите все обрабатываемые строки, в то время как sed работает с каждой строкой, до тех пор пока его не остановишь). Для примера, подстановка адреса "Sebastopol" в предыдущую команду замены, можно ограничить замену "CA" на "California" только строками содержащими "Sebastopol". r0mk 28.12.12 в 10:22 |
||
|
/Sebastopol/s/CA/California/g r0mk 02.01.13 в 20:46 |
||
|
Входные строки содержащие "Sebastopol, CA" будут удовлетворять адресу и команда замены будет применена, заменяя их на "Sebastopol, California". Строка содержащая "San Francisco, CA" не подойдет и замена не будет применена. r0mk 02.01.13 в 20:48 |
||
|
В команде sed может быть указано ноль, одни или два адреса. Адрес может быть регулярным выражением, описывающим шаблон, номером строки или символом адресации в строке. r0mk 02.01.13 в 20:50 |
||
|
Если адрес не указан, тогда команда будет применена ко всем строкам. r0mk 02.01.13 в 20:50 |
||
|
Если указан только один адрес, команда применится к любой строке удовлетворяющей адресу. r0mk 02.01.13 в 20:51 |
||
|
Если два разделенных запятой адреса будут указаны, команда выполнится на первой строке удовлетворяющей первому адресу и все следующие подходящие строки включая строки удовлетворяющие второму адресу. r0mk 02.01.13 в 20:53 |
||
|
Если перед адресом стоит восклицательный знак (!), команда применится ко всем строкам не удовлетворяющим адресу. r0mk 02.01.13 в 20:56 |
||
|
Для иллюстрации того, как адресация работает, рассмотрим пример с использованием команды удаления, d. Скрипт содержащий просто команду d без адреса не выдаст ничего, поскольку он удаляет все строки: r0mk 02.01.13 в 20:58 |
||
|
d r0mk 02.01.13 в 20:58 |
||
|
Когда номер строки указан в качестве адреса, команда применится только к этой строке. Для примера, следущией пример удалит только первую строку: r0mk 02.01.13 в 21:00 |
||
|
1d r0mk 02.01.13 в 21:00 |
||
|
Номер строки относится к внутреннему счетчику, поддерживаемому sed. Счетчик не сбрасывается при множественных входных файлах. Таким образом, не важно, как много файлов указано на входе, будет только однас строка 1 во входном потоке. r0mk 02.01.13 в 21:03 |
||
|
Подобным образом, во входном потоке только одна последняя строка. Она может быть указана с помощью символа адресации $. Следующий пример удаляет последнюю строку входного файла: r0mk 02.01.13 в 21:05 |
||
|
$d r0mk 02.01.13 в 21:05 |
||
|
Символ $ не следует путать с $ используемым в регулярных выражениях, который означает конец строки. r0mk 02.01.13 в 21:06 |
||
|
Когда регулярное выражение обрабатывается как адрес, команда применяется только на строках удовлетворяющих шаблону. Регулярное выражение должно быть выделено слэшами (/). Следующая команда удаления r0mk 02.01.13 в 21:08 |
||
|
/^$/d r0mk 02.01.13 в 21:08 |
||
|
удалит только пустные строки. Все остальные строки останутся нетронутыми. r0mk 02.01.13 в 21:09 |
||
|
Если указать два адреса, тогда Вы укажите диапозон строк на которых команда применяется. Следующий пример показывает как удалить все строки ограниченные парой макросов, в данном случае .TS и .TE, отмеченных знаком табулицы. r0mk 02.01.13 в 21:12 |
||
|
/^\.TS/,/^\.TE/d r0mk 02.01.13 в 21:12 |
||
|
Удалит все строки удовлетворяющие первому шаблону и до второго шаблона включительно. Строки за пределами диапозона затронуты не будут. Следующая команда удалит строки с 50 до конца файла: r0mk 07.01.13 в 18:39 |
||
|
50,$d r0mk 07.01.13 в 18:39 |
||
|
Можно смешивать адрес строки и адрес шаблона: r0mk 07.01.13 в 18:40 |
||
|
1,/^$/d r0mk 07.01.13 в 18:40 |
||
|
Этот пример удали все с первой строки до первой пустрой строки, которая, для примера, удалит почтоый заголовок из интернет письма, сохраненного в файл. r0mk 07.01.13 в 18:42 |
||
|
Может показаться, что первый адрес применяет действие и второй адрес отменяет его. Sed никогда не смотрит вперед для проверки будет ли второй шаблон найден. Действие будет применено к строкам, даже после первого совпадения. Команда будет применена ко всей последовательности строк до второго совпадения. В предыдущем примере, если файл не содержит пустой строки, то все строки будут удалены. r0mk 07.01.13 в 18:46 |
||
|
Восклицательный знак (!) следующий за адресом инвертирует значение шаблона. Для примера, следующий скрипт удалит все строки, исключая строки внутри таблицы: r0mk 07.01.13 в 18:48 |
||
|
/^\.TS/,/^\.TE/!d r0mk 07.01.13 в 18:48 |
||
|
Этот скрипт, фактически, извлекает таблицу из исходного файла. r0mk 07.01.13 в 18:52 |
||
|
4.2.1 Группировка команд r0mk 07.01.13 в 18:52 |
||
|
Скобки ({}) использутся в sed для вкладки одного адреса внутри другого или применения нескольких команд к одному адресу. Можно вкладывать адреса, если хотите указать диапазон строк, а затем, в пределах этого диапазона, укажите другой адрес. Для примера, для удаления пустых строк только внутри блока таблицы, используется следующая команда: r0mk 07.01.13 в 18:59 |
||
|
/^\.TS/,/^\.TE/{ r0mk 07.01.13 в 18:59 |
||
|
/^$/d r0mk 07.01.13 в 18:59 |
||
|
} r0mk 07.01.13 в 18:59 |
||
|
Открывающаяся фигурная скобка должна быть в конце строки и закрывающаяся фигурная скобка должна быть на новой строке. Убедитесь в отсутствкии пробелов после скобок. r0mk 07.01.13 в 19:01 |
||
|
Можно применить несколько команд к одному диапозону строк, включая команды редактирования в скобках, как показано далее: r0mk 07.01.13 в 19:02 |
||
|
/^\.TS/,/^\.TE/{ r0mk 07.01.13 в 19:02 |
||
|
/^$/d r0mk 07.01.13 в 19:02 |
||
|
s/^\.ps 10/.ps 8/ r0mk 07.01.13 в 19:03 |
||
|
s/^\.vs 12/.vs 10/ r0mk 07.01.13 в 19:03 |
||
|
} r0mk 07.01.13 в 19:03 |
||
|
Этот пример не только удаляет пустые строки в таблице, но и так же использует команду замены, s, для изменения некоторых запросов troff. Эта команда применяется только к строка в блоке .TS/.TE. r0mk 07.01.13 в 19:05 |
