Готовый перевод sed & awk / sed & awk: 4.1 Применение команд в скрипте
Комбинирование серий редактирований в скрипте может привести к неожиданному результату. Вы могли не подумать о последствиях одного редактирования, могут повлиять на другие. Новые пользователи обычно думают, что sed применяет индивидуальные команды редактирования ко всем входным строкам, до применения следующей команды редактирования. Но верно обратное. Sed применяет весь скрипт на первой входной строке, до чтения второй входной строки и применения скрипта на ней. Потому что sed всегда работает с последней версией оригинальной строки, любое сделаное изменение изменяет строку для последующих команд. Sed не сохраняет оригинал. Это означает, что шаблон, который мог быть найдет в оригинальной входной строке не будет найдет после сделанных изменений.
Давайте посмотрим на пример, который использует команду замены. Допустим кто-то бысто написал следующий скрипт для замены "pig" на "cow" и "cow" на "horse":
s/pig/cow/
s/cow/horse/
Что Вы думаете произошло? Попробуйте его на тестовом файле. Мы обсудим что произошло позже, после того, как рассмотрим работу sed.
4.1.1 Рабочая область
Sed поддерживает шаблонную область, рабочее пространство или временный буфер, где одна строка находится во время применения команд редактирования. [1] Преобразования шаблонной области двухстрочным скриптом показано на рисунке 4.1. Он меняет "Система Unix" на "Операционная система UNIX".
[1] Одним из преимуществ конструкции строка-за-раз, является то, что sed прожет прочитать очень большой файл без каких либо проблем. Экранные редакторы читают файл в память целиком или большими частями или будут чрезвычайно медленны при работе с большими файлами.
Изначально, рабочая область содержит копию одиночной входной строки. На рисунке 4.1 это строка "The Unix System". При обычном потоке скрипт исполняет каждую команду на этой строке, пока не будет достигнут конец скрипта. Первая команда в скрипте к этой строке, изменяя "Unix" на "UNIX". Вторая команда применяется , изменяя "UNIX System" на "UNIX Operating System." [2] Запомните, что шаблон для второй команды подстановки не соответствует оригинальной входной строке; он соответствует текущей строке, измененной в рабочей области.
[2] Да, мы изменим "Unix System" на "UNIX Operating System" в один шаг. Как правило, входной файл может содеражить "UNIX System" а также "Unix System". Таким образом, путем изменения "Unix" на "UNIX" мы в обоих случаях соответствовать, до изменения на "UNIX Operating System".
Когда все инструкции будут применены, текущая строка направляется на выход и следующая входная строка читается в рабочую область. Затем все команды в скрипте применяются к текущей строке.
Рисунок 4.1: Команды в этом скрипте меняют содержание рабочей области.
Как следствие, любая команда sed может изменять содержание рабочей области для следующей команды. Содержание рабочей области динамично и не всегда соответствует оригинальной строки. Это было проблемой в скрипте для примера в начале главы. Первая команда изменит "pig" на "cow", как ожидалось. Однако, когда вторая команда изменила "cow" на "horse" на этой строке, она так же изменила "cow", которая была "pig". Итак, где входная строка содержала pigs и cows на выходе будут только horses!
Эта ошибка является простой проблемой очереди команд в скрипте. Изменение порядка команд - изменить "cow" на "horse", до изменения "pig" на "cow" - сработает.
s/cow/horse/
s/pig/cow/
Некоторые команды sed изменяют поток, проходящий через скрипт, как мы увидим в следующих главах. Для примера, команда N читает другую строку в рабочей области, без удаления текущей строки, таким образом можно протестировать шаблон в несколько строк. Другие команды говорят set выйти до достижения конца скрипта или перейти к помеченной команде. Sed поддерживает второй временный буфер, называемый удерживаемой областью. Можно копировать содержание рабочей области в удерживаемую область и запросить его позже. Команды, для использования области удержания описаны в Главе 6.
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: перевод редактируется
Переведено на Нотабеноиде
http://notabenoid.org/book/32181/117182
Переводчики: r0mk
Настройки
Готово:
