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

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

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

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

r0mk 28.12.12 в 09:41

0

s/CA/California/g

r0mk 28.12.12 в 09:41

0

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

r0mk 28.12.12 в 10:22

0

/Sebastopol/s/CA/California/g

r0mk 02.01.13 в 20:46

0

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

r0mk 02.01.13 в 20:48

0

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

r0mk 02.01.13 в 20:50

0

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

r0mk 02.01.13 в 20:50

0

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

r0mk 02.01.13 в 20:51

0

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

r0mk 02.01.13 в 20:53

0

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

r0mk 02.01.13 в 20:56

0

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

r0mk 02.01.13 в 20:58

0

d

r0mk 02.01.13 в 20:58

0

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

r0mk 02.01.13 в 21:00

0

1d

r0mk 02.01.13 в 21:00

0

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

r0mk 02.01.13 в 21:03

0

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

r0mk 02.01.13 в 21:05

0

$d

r0mk 02.01.13 в 21:05

0

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

r0mk 02.01.13 в 21:06

0

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

r0mk 02.01.13 в 21:08

0

/^$/d

r0mk 02.01.13 в 21:08

0

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

r0mk 02.01.13 в 21:09

0

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

r0mk 02.01.13 в 21:12

0

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

r0mk 02.01.13 в 21:12

0

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

r0mk 07.01.13 в 18:39

0

50,$d

r0mk 07.01.13 в 18:39

0

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

r0mk 07.01.13 в 18:40

0

1,/^$/d

r0mk 07.01.13 в 18:40

0

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

r0mk 07.01.13 в 18:42

0

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

r0mk 07.01.13 в 18:46

0

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

r0mk 07.01.13 в 18:48

0

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

r0mk 07.01.13 в 18:48

0

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

r0mk 07.01.13 в 18:52

0

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

r0mk 07.01.13 в 18:52

0

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

r0mk 07.01.13 в 18:59

0

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

r0mk 07.01.13 в 18:59

0

/^$/d

r0mk 07.01.13 в 18:59

0

}

r0mk 07.01.13 в 18:59

0

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

r0mk 07.01.13 в 19:01

0

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

r0mk 07.01.13 в 19:02

0

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

r0mk 07.01.13 в 19:02

0

/^$/d

r0mk 07.01.13 в 19:02

0

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

r0mk 07.01.13 в 19:03

0

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

r0mk 07.01.13 в 19:03

0

}

r0mk 07.01.13 в 19:03

0

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

r0mk 07.01.13 в 19:05

0
Минутку...