sed & awk / sed & awk: 4.1 Применение команд в скрипте
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Комбинирование серий редактирований в скрипте может привести к неожиданному результату. Вы могли не подумать о последствиях одного редактирования, могут повлиять на другие. Новые пользователи обычно думают, что sed применяет индивидуальные команды редактирования ко всем входным строкам, до применения следующей команды редактирования. Но верно обратное. Sed применяет весь скрипт на первой входной строке, до чтения второй входной строки и применения скрипта на ней. Потому что sed всегда работает с последней версией оригинальной строки, любое сделаное изменение изменяет строку для последующих команд. Sed не сохраняет оригинал. Это означает, что шаблон, который мог быть найдет в оригинальной входной строке не будет найдет после сделанных изменений. r0mk 06.12.12 в 11:04 |
|
|
Давайте посмотрим на пример, который использует команду замены. Допустим кто-то бысто написал следующий скрипт для замены "pig" на "cow" и "cow" на "horse": r0mk 06.12.12 в 11:05 |
||
|
s/pig/cow/ r0mk 06.12.12 в 11:05 |
||
|
s/cow/horse/ r0mk 06.12.12 в 11:05 |
||
|
Что Вы думаете произошло? Попробуйте его на тестовом файле. Мы обсудим что произошло позже, после того, как рассмотрим работу sed. r0mk 07.12.12 в 04:30 |
||
|
4.1.1 Рабочая область r0mk 20.12.12 в 06:15 |
||
|
Sed поддерживает шаблонную область, рабочее пространство или временный буфер, где одна строка находится во время применения команд редактирования. [1] Преобразования шаблонной области двухстрочным скриптом показано на рисунке 4.1. Он меняет "Система Unix" на "Операционная система UNIX". r0mk 20.12.12 в 06:18 |
||
|
[1] Одним из преимуществ конструкции строка-за-раз, является то, что sed прожет прочитать очень большой файл без каких либо проблем. Экранные редакторы читают файл в память целиком или большими частями или будут чрезвычайно медленны при работе с большими файлами. r0mk 27.12.12 в 11:01 |
||
|
Изначально, рабочая область содержит копию одиночной входной строки. На рисунке 4.1 это строка "The Unix System". При обычном потоке скрипт исполняет каждую команду на этой строке, пока не будет достигнут конец скрипта. Первая команда в скрипте к этой строке, изменяя "Unix" на "UNIX". Вторая команда применяется , изменяя "UNIX System" на "UNIX Operating System." [2] Запомните, что шаблон для второй команды подстановки не соответствует оригинальной входной строке; он соответствует текущей строке, измененной в рабочей области. r0mk 27.12.12 в 11:37 |
||
|
[2] Да, мы изменим "Unix System" на "UNIX Operating System" в один шаг. Как правило, входной файл может содеражить "UNIX System" а также "Unix System". Таким образом, путем изменения "Unix" на "UNIX" мы в обоих случаях соответствовать, до изменения на "UNIX Operating System". r0mk 27.12.12 в 11:42 |
||
|
Когда все инструкции будут применены, текущая строка направляется на выход и следующая входная строка читается в рабочую область. Затем все команды в скрипте применяются к текущей строке. r0mk 27.12.12 в 11:44 |
||
|
Рисунок 4.1: Команды в этом скрипте меняют содержание рабочей области. r0mk 27.12.12 в 11:48 |
||
|
Как следствие, любая команда sed может изменять содержание рабочей области для следующей команды. Содержание рабочей области динамично и не всегда соответствует оригинальной строки. Это было проблемой в скрипте для примера в начале главы. Первая команда изменит "pig" на "cow", как ожидалось. Однако, когда вторая команда изменила "cow" на "horse" на этой строке, она так же изменила "cow", которая была "pig". Итак, где входная строка содержала pigs и cows на выходе будут только horses! r0mk 27.12.12 в 11:53 |
||
|
Эта ошибка является простой проблемой очереди команд в скрипте. Изменение порядка команд - изменить "cow" на "horse", до изменения "pig" на "cow" - сработает. r0mk 27.12.12 в 11:56 |
||
|
s/cow/horse/ r0mk 27.12.12 в 11:01 |
||
|
s/pig/cow/ r0mk 27.12.12 в 11:01 |
||
|
Некоторые команды sed изменяют поток, проходящий через скрипт, как мы увидим в следующих главах. Для примера, команда N читает другую строку в рабочей области, без удаления текущей строки, таким образом можно протестировать шаблон в несколько строк. Другие команды говорят set выйти до достижения конца скрипта или перейти к помеченной команде. Sed поддерживает второй временный буфер, называемый удерживаемой областью. Можно копировать содержание рабочей области в удерживаемую область и запросить его позже. Команды, для использования области удержания описаны в Главе 6. r0mk 27.12.12 в 12:05 |
