[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Обработка строк с помощью sed

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

Редактор хранит в памяти лишь небольшое количество строк редактируемого файла и не создает временных файлов. Поэтому длина редактируемого файла ограничена только объемом памяти, доступной для входного файла и вывода.

Запуск редактора

Для работы с редактором необходимо создать командный файл, содержащий команды редактирования входного файла. Команды редактирования выполняют составные операции, и для их запуска не требуется вводить большой объем данных в командный файл. Каждая команда в командном файле должна быть указана на отдельной строке. После создания этого файла введите в командной строке:

sed -fкомандный-файл >вывод <ввод

У этой команды есть следующие параметры:

командный_файл Имя командного файла, содержащего команды редактирования.
Вывод Имя файла, в который будет помещен отредактированный вывод.
Ввод Имя файла (или файлов) для редактирования.

После этого программа sed выполняет необходимые изменения и записывает полученную информацию в файл вывода. Содержимое входного файла остается без изменений.

Алгоритм работы программы sed

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

Поток ввода Поток символов ASCII из файлов или непосредственно с клавиатуры. Эти данные будут отредактированы программой.
Команды Набор адресов и связанных команд, указанных для выполнения в следующем формате:

[Строка1 [,Строка2] ] команда [аргумент]

Параметры Строка1 и Строка2 называются адресами. Они могут представлять собой шаблоны, по которым будет выполнен поиск во входных данных, или номера строк входного потока.

Команды редактирования можно вводить вместе с командой sed с помощью флага -e.

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

Сравнив все адреса, указанные в командном файле, с содержимым области шаблона, программа sed записывает итоговое содержимое области шаблона в стандартный вывод. После этого из стандартного ввода считывается следующая строка и повторяется процесс, задаваемый командным файлом.

Некоторые команды редактирования изменяют описанную последовательность действий.

На способ выполнения команды sed влияют и заданные вместе с ней флаги. Дополнительная информация по этому вопросу приведена в разделе Обзор команд sed.

Работа с регулярными выражениями

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

Обзор команд sed

У всех команд sed однобуквенные имена. Обычно они вызываются с некоторыми параметрами, например, номерами строк или текстовыми строками. Перечисленные ниже команды изменяют строки в области шаблона.

В синтаксических диаграммах применяются следующие символы:

Символ Описание
[ ] В квадратные скобки заключаются необязательные параметры команды.
курсив Параметры, выделенные курсивом, обозначают значения, которые вы должны ввести. Например, параметр имя_файла нужно заменить фактическим именем файла.
Строка1 Этот параметр обозначает номер строки ввода или стандартное выражение для сравнения, с которого начнется применение команды редактирования.
Строка2 Этот параметр обозначает номер строки ввода или стандартное выражение для сравнения, на котором закончится применение команды редактирования.

Обработка строк


Функция Синтаксис/Описание
добавить строки [Строка1]a\\nТекст

Записывает строки, содержащиеся в блоке Текст, в поток вывода после Строки1. Команда a указывается в конце строки.

изменить строки [Строка1 [,Строка2] ]c\\nТекст

Удаляет строки с адресами Строка1 и Строка2, как и команда удалить строки. Затем записывает вместо них в поток вывода блок Текст.

удалить строки [Строка1 [,Строка2] ]d

Удаляет строки из потока ввода без последующего копирования их в поток вывода. Будут удалены строки, начиная со Строки1. Следующей в поток вывода будет скопирована строка с номером Строка2 + 1. Если вы укажете только один номер строки, то будет удалена только одна указанная строка. Если вы не укажете номер строки, то следующая строка не будет скопирована. Над строками, не скопированными в поток вывода, никакие действия выполнить нельзя.

вставить строки [Строка1] i \\nТекст

Записывает строки из блока Текст в поток вывода перед Строкой1. Команда i указывается в конце строки.

следующая строка [Строка1 [,Строка2] ]n

Считывает следующую строку или группу строк, начиная от Строки1 и заканчивая Строкой2, в область шаблона. Текущее содержимое области шаблона будет записано в вывод (если оно не было удалено).

Подстановка


Функция Синтаксис/Описание
подстановка по шаблону [Строка1 [,Строка2] ] s/Шаблон/Строка/Флаги

Выполняет в заданной строке (строках) поиск последовательности символов, соответствующей регулярному выражению, заданному в параметре Шаблон. Если такие символы будут найдены, команда заменит их другим набором символов, задаваемых параметром Строка.

Ввод и вывод


Функция Синтаксис/Описание
печать строк [Строка1 [,Строка2] ] p

Записывает указанные строки в STDOUT с теми изменениями, которые были внесены в ходе редактирования до вызова команды p.

записать строки [строка-1 [,строка-2] ]wимя-файла

Записывает в файл имя-файла указанные строки с теми изменениями, которые были внесены в ходе редактирования до вызова команды w.

Если файл с именем имя-файла существует, то он обновляется; в противном случае он создается. В процессе редактирования можно задать до 10 различных файлов ввода или вывода. Между именем команды w и параметром имя-файла должен быть указан строго один пробел.

считать файл [строка-1]rимя-файла

Считывает содержимое файла имя-файла и добавляет его после строки-1.

Между именем команды r и именем-файла должен быть указан ровно один пробел. Если файл имя-файла открыть не удастся, то команда будет считать, что файл пустой. Сообщение об ошибке выдано не будет.

Поиск шаблона с объединением строк


Функция Синтаксис/Описание
объединить строки [Строка1 [,Строка2] ]N

Объединяет указанные строки ввода, подставляя вместо разрыва символ новой строки. Шаблон может содержать символы из обоих строк.

удалить первую строку области шаблона [Строка1 [,Строка2] ]D

Удаляет весь текст в области шаблона до первого символа новой строки (включительно). Если в области шаблона записана только одна строка, то будет считана следующая строка. Повторно выполняет все указанные команды редактирования с самого начала.

печатать первую строку области шаблона [Строка1 [,Строка2] ]P

Записывает весь текст из области шаблона до первого символа новой строки (включительно) в STDOUT.

Копирование и вставка


Функция Синтаксис/Описание
скопировать [Строка1 [,Строка2] ]h

Копирует текст из области шаблона, расположенный между Строкой1 и Строкой2, в промежуточную область.

скопировать с добавлением [Строка1 [,Строка2] ]H

Копирует текст из области шаблона, расположенный между Строкой1 и Строкой2, в промежуточную область путем добавления к хранящейся там информации.

вставить копию [Строка1 [,Строка2] ]g

Копирует текст из промежуточной области в область шаблона, вставляя его между Строкой1 и Строкой2. Содержимое, уже хранящееся в области шаблона, будет уничтожено.

вставить копию с добавлением [Строка1 [,Строка2] ]G

Копирует текст из промежуточной области в область шаблона после блока, ограниченного Строкой1 и Строкой2. Содержимое, уже хранящееся в области шаблона, изменено не будет. От добавленного текста его будет отделять символ новой строки.

обмен копиями [Строка1 [,Строка2] ]x

Выполняет обмен содержимого промежуточной области и текста из области шаблона, расположенного между Строкой1 и Строкой2.

Управление


Функция Синтаксис/Описание
отрицание [Строка1 [,Строка2] ]!

Символ ! (восклицательный знак) означает, что указанная после него команда должна быть применена к данным файла ввода, лежащим вне области, ограниченной строками Строка1 и Строка2.

группы команд [Строка1 [,Строка2] ]{

набор команд

}

В фигурных скобках ({ }) указывается набор команд, которые должны быть выполнены над строками ввода, расположенными между Строкой1 и Строкой2. Первая команда из этого набора должна быть указана в одной строке с левой скобкой или в следующей после нее строке. Правая скобка должна указываться в отдельной строке. Допускается вложенность групп команд.

метки :Метка

Отмечает для каждой ветви выполнения конечную точку в последовательности команд редактирования. Метка представляет собой строку длиной до 8 символов. Все Метки в потоке редактирования должны быть уникальны.

безусловный переход к метке [Строка1 [,Строка2] ]xМетка

Переход к команде редактирования с заданной Меткой. Обработка текущего ввода продолжится со следующей команды. Если задана пустая Метка, то будет выполнен переход к концу последовательности команд редактирования, после чего будет считана новая строка ввода, и для нее эта последовательность начнет выполняться сначала. Указываемая здесь Метка должна быть предварительно задана в последовательности команд.

переход с проверкой [Строка1 [,Строка2] ]tМетка

Если в текущей строке ввода была выполнена хотя бы одна подстановка, то переход к команде с заданной Меткой. Если подстановка не выполнялась, то команда никаких действий не выполнит. Флаг, установленный после выполнения подстановки, сбрасывается. Этот флаг сбрасывается в начале каждой новой строки ввода.

ожидание [Строка1 ]q

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

определить номер строки [Строка1 ]=

Записывает в стандартный вывод номер строки, совпадающей со Строкой1.

Применение текста в командах

Для команд обработки строк добавить, вставить и изменить задается текст, который будет добавлен в поток вывода. Этот текст задается в соответствии со следующими правилами:

Замена строк

Команда s заменяет символы в указанных строках файла ввода. Если команда найдет набор символов, соответствующий регулярному выражению, заданному в параметре Шаблон, она заменит их другим набором символов, задаваемым параметром Строка.

Параметр Строка представляет собой последовательность символов (цифр, букв и знаков). Строка может содержать два специальных символа:

Символ Назначение
& Этот символ из поля строка заменяется в строках ввода на символы, заданные в параметре шаблон. Пример:

s/boy/&s/

указывает программе sed, что нужно найти слово boy в файле ввода и скопировать этот шаблон в вывод, добавив к нему букву s. Следовательно:

Строка: The boy look at the game.
Будет заменена на: The boys look at the game.

Символ Назначение
\d d - одна цифра. Этот символ в параметре Строка заменяется на символы строки ввода, совпадающие подстрокой Шаблона номер d. Эти подстроки начинаются и заканчиваются символом \. Например, команда:

s/\(stu\)\(dy\)/\1r\2/

Заменяет строку:
The study chair

На:
The sturdy chair

Буквы, указываемые в качестве флагов, задают следующие параметры редактирования:

Символ Назначение
g Заменяет в указанной строке (строках) все вхождения Шаблона на Строку. После вставки в символах Строки поиск Шаблона не выполняется. Например, команда:

s/r/R/g

выполняет следующее действие:

Заменяет строку:
the red round rock

На:
the Red Round Rock
p Печатает (в STDOUT) строку, содержащую вхождение Шаблона.
w файл Записывает в указанный файл строку, содержащую вхождение шаблона. Если файл имя_файла существует, он будет заменен; в противном случае он будет создан. В процессе редактирования можно задать до 10 различных файлов ввода или вывода. Между именем команды w и параметром имя_файла должен быть указан строго один пробел.


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]