sed & awk / sed & awk: 2.1 Awk, путем sed и grep, без Ed
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Вы можете проследить родословную awk к sed и grep, и через эти две программы к ed, оригинальному UNIX редактору. r0mk 14.09.12 в 04:34 |
|
|
Вы когда нибудь использовали строковый редактор? Если так, Вам будет намного легче понять обработку строк sed и awk. Если Вы использовали vi, полноэкранный редактор, тогда Вы знакомы с некоторыми командами, которые взяты из основного строгового редактора ex (который является расширением для ed). r0mk 14.09.12 в 06:16 |
||
|
Давайте рассмотрим некоторые базовые операции строкового редактора ed. Не волнуйтесть, это упражнение преднозначено для того, чтобы помочь Вам изучить sed и awk, а не попытаться убедить Вас в чудестности строковых редакторов. Команды Ed, показанные в упражении идентичны командам sed, которые мы изучим позже. Почувствуйте свободу экспериметнов используя ed, чтобы почувствовать как он работает. (Если Вы уже близком знакомы с ed смело переходите к следующей части.) r0mk 17.09.12 в 09:58 |
||
|
При использовании строкового редактора, Вы работаете с одной строкой за раз. Это важно знать, на какой строке в файле Вы находитесь. Когда вы открываете файл используя ed, он показывает Вам количество символов в файле и Вы нахогдитесь на последней строке. r0mk 17.09.12 в 10:04 |
||
|
$ ed test r0mk 15.09.12 в 07:44 |
||
|
339 r0mk 17.09.12 в 10:04 |
||
|
Это не строка. Если Вы введете команду, которую ed не понимает, он напечатает в ковычка сообщение об ошибке. Вы можете ввести команду р для отображения текущего файла. r0mk 17.09.12 в 10:06 |
||
|
р r0mk 17.09.12 в 10:06 |
||
|
остановимся на первом пункте. r0mk 17.09.12 в 10:07 |
||
|
По умолчанию, поманды применяются на текущем файле. Для редактирования Вы перемещаетесь на строку, которую хотите отредактировать и применяете команду. Для переходя на строку Вы указываете ее адрес. Адрес помжет содержать номер строки, указательтельный символ, конкретную позицию в файле или регулярное выражение. Вы моежете перейти на первую строку введя номер строки 1. Затем Вы можете ввести команду удаления для удаления строки. r0mk 17.09.12 в 10:10 |
||
|
1 r0mk 17.09.12 в 10:10 |
||
|
Вам это может показаться регулярным выражением. r0mk 17.09.12 в 10:11 |
||
|
d r0mk 17.09.12 в 10:11 |
||
|
Вводя "1" происходит переход на первую строку текущего файла и отображение ее на экране. Команда удаления в ed это d и здесь она удаляет текущую строку. Предпочтительней перейти на строку и затем редактировать ее, Вы можете указать команду для редактирования с адресом, который укажет какую строку или диапозон строк будут объектами команды. Если Вы введете "1d", то первая строка будет удалена. r0mk 17.09.12 в 10:16 |
||
|
Вы также можете указать регулярное выражение в качестве адреса. Для удаелния строки содержащей слово "regular," Вы можете выполнить следующую команду: r0mk 17.09.12 в 10:17 |
||
|
/regular/d r0mk 17.09.12 в 10:17 |
||
|
где слэши разделяют регулярное выражение и "regular", строку которую Вы ищите. Эта команда удалит первую строку содержащую "regular" и сделает перейдет на следующую строку в текущем файле. r0mk 17.09.12 в 10:19 |
||
|
Внимание: Убедитесь, что Вы понимаете, что команда удаления удаляет всю строку. Она не просто удаляет слово "regular" в строке. r0mk 17.09.12 в 10:22 |
||
|
Для удаления всех строк которые содержат регулярное выражение, в начните команду с буквы g для глобального применения. r0mk 17.09.12 в 10:23 |
||
|
g/regular/d r0mk 17.09.12 в 10:24 |
||
|
Глобальная команда делает все строчки соответствующие регулярному выражению объектами указанной команды. r0mk 17.09.12 в 10:25 |
||
|
Удаление текста не столь интерестно. Замена текста (замена одного куска текста другим) более интересна. Команда замены, s, в ed: r0mk 17.09.12 в 10:26 |
||
|
[address]s/pattern/replacement/flag r0mk 17.09.12 в 10:26 |
||
|
шаблон регулярного выражения, которону удовлетворяет строка в текущем файле заменяется. Для примера, приведенная команда заменяет первое встретившееся "regular" на "complex" для текущей строки. r0mk 17.09.12 в 10:28 |
||
|
s/regular/complex/ r0mk 17.09.12 в 10:28 |
||
|
Адрес не был указан, и эфект будет только на первом вхождении в текущей строке. Будет ошибка если "regular" не будет найден в текущей строке. Для просмотра всех вхождений в одной и тойже строке Вам необходимо указать g в качестве флага: r0mk 17.09.12 в 10:34 |
||
|
s/regular/complex/g r0mk 17.09.12 в 10:30 |
||
|
Эта команда изменит все вхождения в текущем файле. Адрес должен буть указан, чтобы команда работала далее чем текущая строка. Следующая команда задает адрес: r0mk 17.09.12 в 10:35 |
||
|
/regular/s/regular/complex/g r0mk 17.09.12 в 10:31 |
||
|
Эта команда буедт применена к первой строке удовлетворяющей адресу в файле. Запомните, первое "regular" является адресом, а второе является шаблоном для поиска для заменяющей команды. Для применения на всех строках используйте глобальную команду, указав g перед адресом. r0mk 17.09.12 в 10:38 |
||
|
g/regular/s/regular/complex/g r0mk 17.09.12 в 10:31 |
||
|
Теперь измерения будут сделаны везде - на всех вхождениях во всех строках. r0mk 19.09.12 в 07:37 |
||
|
Внимание: Запомните особенность "g." и "g" первое это глобальная команда, которая означает, что нужно применять изменения на всех строках удовлетворяющих адресу. "g" в конце является флагом, означающим измнение всех вхождений в строке, а не только первого. r0mk 17.09.12 в 10:41 |
||
|
Адрес и шаблон не обязательно будут одинаковыми. r0mk 17.09.12 в 10:31 |
||
|
g/regular expression/s/regular/complex/g r0mk 17.09.12 в 10:41 |
||
|
На любой строке сореджащей "regular expression," заменяется "regular" на"complex.". Если адрес и шаблон одинаковые, то Вы можете указать ed два последовательных разделителя (//). r0mk 19.09.12 в 07:39 |
||
|
g/regular/s//complex/g r0mk 19.09.12 в 07:39 |
||
|
В этом примере "regular" указывает и адрес и шаблон для замены. Если Вам кажется, что мы рассмотрели эти команды быстро и здесь много информации для освоения - не волнуйтесь. Мы рассмотрим эти команды позже снова. r0mk 19.09.12 в 07:42 |
||
|
Знакомая UNIX утилита grep произошла от следующей глобальной команды ed: r0mk 19.09.12 в 07:44 |
||
|
g/re/p r0mk 19.09.12 в 07:43 |
||
|
которая означает ""global regular expression print." Grep является командой, которая была извлечена из ed стала доступна как внешняя программа. Трудно выполнить одну команду редактирования. Она берет регулярное выражение в качестве аргумента из командной строки и использует адрес адрес строки для печати. Вот пример для поиска по шаблону "box": r0mk 19.09.12 в 07:51 |
||
|
grep 'box' test r0mk 19.09.12 в 07:51 |
||
|
Вы получите набор box'ов, первый будет отмечен "A", r0mk 19.09.12 в 07:53 |
||
|
пометка на первом box. r0mk 19.09.12 в 07:53 |
||
|
Она печатает все строки, удовлетворяющие регулярному выражению. r0mk 19.09.12 в 07:54 |
||
|
Еще одной интерестной особенностью ed является возможность записать в отдельный скрипт Ваши изменения и r0mk 19.09.12 в 07:58 |
||
|
ed test < ed-script r0mk 20.09.12 в 11:09 |
||
|
Эта особенность сделала из ed программируемый редактор - Вы можете написать скрипт для любого действия, которое выполняете вручную. r0mk 21.09.12 в 04:42 |
||
|
Sed был создан как спечиально предназначенный редактор для исключительно запуска скриптов; в отличии от ed, он не может использоваться интерактивно. Sed отличается от ed в основном в потоко-ориентированности. По-умолчанию, все входные данные пропускаются через sed и подаются на выход. Входной файл при этом не изменяется. Если Вы хотите изменить входной файл Вы обычно используете механизмы шелл для перенаправления выхода и когда Вы довольны сделанным результатом- заменяете оригинальный файл на его модифицированную версию. r0mk 21.09.12 в 07:32 |
||
|
ed не потоко-ориентированный редактор и производит изменения в самом файле. Ed скрипт должен содержать команды для сохраниния файла и выхода из редактора. Он не производит вывода на экран, не считая случаев сгенерированных другими командами. r0mk 21.09.12 в 07:34 |
