sed & awk / sed & awk: 2.1 Awk, путем sed и grep, без Ed

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

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

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

r0mk 14.09.12 в 04:34

0

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

r0mk 14.09.12 в 06:16

0

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

r0mk 17.09.12 в 09:58

0

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

r0mk 17.09.12 в 10:04

0

$ ed test

r0mk 15.09.12 в 07:44

0

339

r0mk 17.09.12 в 10:04

0

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

r0mk 17.09.12 в 10:06

0

р

r0mk 17.09.12 в 10:06

0

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

r0mk 17.09.12 в 10:07

0

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

r0mk 17.09.12 в 10:10

0

1

r0mk 17.09.12 в 10:10

0

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

r0mk 17.09.12 в 10:11

0

d

r0mk 17.09.12 в 10:11

0

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

r0mk 17.09.12 в 10:16

0

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

r0mk 17.09.12 в 10:17

0

/regular/d

r0mk 17.09.12 в 10:17

0

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

r0mk 17.09.12 в 10:19

0

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

r0mk 17.09.12 в 10:22

0

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

r0mk 17.09.12 в 10:23

0

g/regular/d

r0mk 17.09.12 в 10:24

0

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

r0mk 17.09.12 в 10:25

0

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

r0mk 17.09.12 в 10:26

0

[address]s/pattern/replacement/flag

r0mk 17.09.12 в 10:26

0

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

r0mk 17.09.12 в 10:28

0

s/regular/complex/

r0mk 17.09.12 в 10:28

0

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

r0mk 17.09.12 в 10:34

0

s/regular/complex/g

r0mk 17.09.12 в 10:30

0

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

r0mk 17.09.12 в 10:35

0

/regular/s/regular/complex/g

r0mk 17.09.12 в 10:31

0

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

r0mk 17.09.12 в 10:38

0

g/regular/s/regular/complex/g

r0mk 17.09.12 в 10:31

0

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

r0mk 19.09.12 в 07:37

0

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

r0mk 17.09.12 в 10:41

0

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

r0mk 17.09.12 в 10:31

0

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

r0mk 17.09.12 в 10:41

0

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

r0mk 19.09.12 в 07:39

0

g/regular/s//complex/g

r0mk 19.09.12 в 07:39

0

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

r0mk 19.09.12 в 07:42

0

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

r0mk 19.09.12 в 07:44

0

g/re/p

r0mk 19.09.12 в 07:43

0

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

r0mk 19.09.12 в 07:51

0

grep 'box' test

r0mk 19.09.12 в 07:51

0

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

r0mk 19.09.12 в 07:53

0

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

r0mk 19.09.12 в 07:53

0

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

r0mk 19.09.12 в 07:54

0

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

r0mk 19.09.12 в 07:58

0

ed test < ed-script

r0mk 20.09.12 в 11:09

0

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

r0mk 21.09.12 в 04:42

0

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

r0mk 21.09.12 в 07:32

0

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

r0mk 21.09.12 в 07:34

0
Минутку...

Следующая страница →