Готовый перевод sed & awk / sed & awk: 2.1 Awk, путем sed и grep, без Ed

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

Вы можете проследить родословную awk к sed и grep, и через эти две программы к ed, оригинальному UNIX редактору.

Вы когда нибудь использовали строковый редактор? Если так, Вам будет намного легче понять обработку строк sed и awk. Если Вы использовали vi, полноэкранный редактор, тогда Вы знакомы с некоторыми командами, которые взяты из основного строгового редактора ex (который является расширением для ed).

Давайте рассмотрим некоторые базовые операции строкового редактора ed. Не волнуйтесть, это упражнение преднозначено для того, чтобы помочь Вам изучить sed и awk, а не попытаться убедить Вас в чудестности строковых редакторов. Команды Ed, показанные в упражении идентичны командам sed, которые мы изучим позже. Почувствуйте свободу экспериметнов используя ed, чтобы почувствовать как он работает. (Если Вы уже близком знакомы с ed смело переходите к следующей части.)

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

$ ed test

339

Это не строка. Если Вы введете команду, которую ed не понимает, он напечатает в ковычка сообщение об ошибке. Вы можете ввести команду р для отображения текущего файла.

р

остановимся на первом пункте.

По умолчанию, поманды применяются на текущем файле. Для редактирования Вы перемещаетесь на строку, которую хотите отредактировать и применяете команду. Для переходя на строку Вы указываете ее адрес. Адрес помжет содержать номер строки, указательтельный символ, конкретную позицию в файле или регулярное выражение. Вы моежете перейти на первую строку введя номер строки 1. Затем Вы можете ввести команду удаления для удаления строки.

1

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

d

Вводя "1" происходит переход на первую строку текущего файла и отображение ее на экране. Команда удаления в ed это d и здесь она удаляет текущую строку. Предпочтительней перейти на строку и затем редактировать ее, Вы можете указать команду для редактирования с адресом, который укажет какую строку или диапозон строк будут объектами команды. Если Вы введете "1d", то первая строка будет удалена.

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

/regular/d

где слэши разделяют регулярное выражение и "regular", строку которую Вы ищите. Эта команда удалит первую строку содержащую "regular" и сделает перейдет на следующую строку в текущем файле.

Внимание: Убедитесь, что Вы понимаете, что команда удаления удаляет всю строку. Она не просто удаляет слово "regular" в строке.

Для удаления всех строк которые содержат регулярное выражение, в начните команду с буквы g для глобального применения.

g/regular/d

Глобальная команда делает все строчки соответствующие регулярному выражению объектами указанной команды.

Удаление текста не столь интерестно. Замена текста (замена одного куска текста другим) более интересна. Команда замены, s, в ed:

[address]s/pattern/replacement/flag

шаблон регулярного выражения, которону удовлетворяет строка в текущем файле заменяется. Для примера, приведенная команда заменяет первое встретившееся "regular" на "complex" для текущей строки.

s/regular/complex/

Адрес не был указан, и эфект будет только на первом вхождении в текущей строке. Будет ошибка если "regular" не будет найден в текущей строке. Для просмотра всех вхождений в одной и тойже строке Вам необходимо указать g в качестве флага:

s/regular/complex/g

Эта команда изменит все вхождения в текущем файле. Адрес должен буть указан, чтобы команда работала далее чем текущая строка. Следующая команда задает адрес:

/regular/s/regular/complex/g

Эта команда буедт применена к первой строке удовлетворяющей адресу в файле. Запомните, первое "regular" является адресом, а второе является шаблоном для поиска для заменяющей команды. Для применения на всех строках используйте глобальную команду, указав g перед адресом.

g/regular/s/regular/complex/g

Теперь измерения будут сделаны везде - на всех вхождениях во всех строках.

Внимание: Запомните особенность "g." и "g" первое это глобальная команда, которая означает, что нужно применять изменения на всех строках удовлетворяющих адресу. "g" в конце является флагом, означающим измнение всех вхождений в строке, а не только первого.

Адрес и шаблон не обязательно будут одинаковыми.

g/regular expression/s/regular/complex/g

На любой строке сореджащей "regular expression," заменяется "regular" на"complex.". Если адрес и шаблон одинаковые, то Вы можете указать ed два последовательных разделителя (//).

g/regular/s//complex/g

В этом примере "regular" указывает и адрес и шаблон для замены. Если Вам кажется, что мы рассмотрели эти команды быстро и здесь много информации для освоения - не волнуйтесь. Мы рассмотрим эти команды позже снова.

Знакомая UNIX утилита grep произошла от следующей глобальной команды ed:

g/re/p

которая означает ""global regular expression print." Grep является командой, которая была извлечена из ed стала доступна как внешняя программа. Трудно выполнить одну команду редактирования. Она берет регулярное выражение в качестве аргумента из командной строки и использует адрес адрес строки для печати. Вот пример для поиска по шаблону "box":

grep 'box' test

Вы получите набор box'ов, первый будет отмечен "A",

пометка на первом box.

Она печатает все строки, удовлетворяющие регулярному выражению.

Еще одной интерестной особенностью ed является возможность записать в отдельный скрипт Ваши изменения и

ed test < ed-script

Эта особенность сделала из ed программируемый редактор - Вы можете написать скрипт для любого действия, которое выполняете вручную.

Sed был создан как спечиально предназначенный редактор для исключительно запуска скриптов; в отличии от ed, он не может использоваться интерактивно. Sed отличается от ed в основном в потоко-ориентированности. По-умолчанию, все входные данные пропускаются через sed и подаются на выход. Входной файл при этом не изменяется. Если Вы хотите изменить входной файл Вы обычно используете механизмы шелл для перенаправления выхода и когда Вы довольны сделанным результатом- заменяете оригинальный файл на его модифицированную версию.

ed не потоко-ориентированный редактор и производит изменения в самом файле. Ed скрипт должен содержать команды для сохраниния файла и выхода из редактора. Он не производит вывода на экран, не считая случаев сгенерированных другими командами.

Потоко ориентированность sed имеет большое влияние на то, как применяется адресация. В ed команда без указания адреса применяется только к текущей строке. Sed проходит по всему файлу по одной строке за раз, так как будто каждая строка является текущей и команда применяется к ней. В результате sed применяет команду без адреса к каждой строке в файле.

Взгянем на следующую команду замены:

s/regular/complex

Если Вы введете эту команду интерактивно в ed, то Вы замените "complex" на первый встретившийcя "regular" в текущей строке. В ed скрипте, если это была первая команда в скрипте, она будет применена к последней строке в файле( в ed это строка по-умолчанию). Как правило в sed скрипте такая же команда будет применена ко всем строкам. Так как, команды sed изначально глобальны. В sed предыдущий пример будет иметь такой же результат, как и следующая гломальная команда в ed:

g/regular/s//complex/

Внимание: Понимание разницы между адресацией в текущей строке в ed и глобальной адресацией в sed является очень важным. В ed Вы используете адресацию чтобы расширить количество строк, являющихся объектами команды; В sed Вы используете адресацию для ограничения количества строк затронутых командой.

Sed разработан с некоторыми дополнительными командами, которые поддерживают написание скриптов. Мы рассмотрим многие из них в главе 6, Дополнительные команды sed.

Awk был разработан как программируемый редактор, как sed, потоко-ориентированыый и использующий скрипт из команд редактирования. Где awk отходит от sed, в отбросе настроек команд редактирования. Он предлагает вместо этого язык программирования основанный на языке С.Оператор печати заменяет команду р, для примера. Концепт адресации представлен так:

/regular/ { print }

печатать те строки, которые содержат "regular". Фигурные скобки ({}) выделяют один или несколько операторов, которые применяются к одному и тому же адресу.

Преимущество использования языка программирования в скриптах в том, что он предлагает намного больше возможностей для контроля, того, что делает программируемый редактор. Awk предлагает выражения, условные операторы, циклы и другие програмные конструкции.

Одной отличительной особенностью awk является анализ или разбор каждой входной строки и делает возможным обработки каждого слова с помощью скрипта. (Редактор, такой как vi, так же распознает слова, позволяя предвигаться от слова к слову или делать слово объектом действия, но эта особенность может быть использована только интерактивно.)

Хотя awk был спроектирован как программируемый редактор, пользователи нашли, что awk скрипты имеют больший спектр возможностей. Авторы awk не молгли и представить, что он будет использоваться для написания больших програм. Но, признавали, что awk используется таким способом, авторы пересмотрели язык, создавая nawk, чтобы предложить большую поддержку для написания больших программ и решения проблем программирования общего назначения. Эта новая мерсия, с незначительными улучшениями, сейчас кодифицирована POSIX стандартом.

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

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

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

Настройки

Готово:

100.00% КП = 1.0