Sed

Правильный заголовок этой статьи — sed. Он показан некорректно из-за технических ограничений.

sed (от английского Stream EDitor) — потоковый редактор. Простая, но мощная компьютерная программа, использующая различные предопределённые текстовые преобразования к последовательному потоку текстовых данныех. sed получает входной поток (обычно, файл) построчно, редактирует каждую строку, согласно правилам, определённым в простом языке (sed-скрипт), и затем выводит в выходной поток. Первоначально sed был создан Lee E. McMahon из Bell Labs, как UNIX-утилита, в 197374 годах. Сейчас sed доступен фактически для любой операционной системы, которая поддерживает работу с командной строкой.

sed часто считают неинтерактивным текстовым редактором. Однако, он отличается от обычных текстовых редакторов «инвертированностью» по отношению к тексту и набору команд для его редактирования. Обычные текстовые редакторы вначале загружают весь текст документа, а затем применяют к нему команды по одной, в то время как sed вначале загружает в себя набор команд, а затем применяет весь набор команд к каждой строчке текста. Так как одновременно в памяти находится только одна строка, sed может обработать произвольно большие текстовые файлы.

Набор команд sed сделан по образцу редактора ed, однако необходимо помнить о его инвертированности. Например, команда 25d редактора ed означает «идите к строке 25 и удалите её», в то время как та же команда sed означает «если это строка с номером 25, то удалите (не выведите), её». Известное исключение — это команды копирования и перемещения, которые охватывают диапазон строк и таким образом не имеют прямых эквивалентов в sed. Вместо этого sed вводит дополнительный буфер, названный пространством «захвата», и дополнительные команды для управления им. Команда ed «скопировать строку 25 в стороку 76» (25t76), например, была бы закодирована как две отдельных команды в sed (25h; 76g), для того чтобы сохранить строку в пространстве захвата до тех пор, пока данные не будут извлечены.

Следующий пример демонстрирует типичное использование sed:

sed -e 's/oldstuff/newstuff/g' inputFileName > outputFileName

Здесь s — замена; g — глобально, что означает «в во всей строке». То, что находится после первого прямого слэша (наклонная черта вправо), — регулярное выражение для поиска, после второго прямого слэша расположено выражение для замены. Команда замены (s///) безусловно является самой мощной и часто используемой командой sed. Перенаправление стандартного вывода «> outputFileName» можно опустить, тогда sed выведет результат на экран.

В Unix sed часто используется в виде фильтра в конвейере (|, или pipe):

generate_data | sed -e 's/x/y/'

Таким образом, генерируются данные и передаются на конвейер, чтобы заменить x на y.

Несколько замен или других команд могут быть соединены в файле, названном, например, subst.sed, и затем применены в виде:

sed -f subst.sed inputFileName > outputFileName

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

sed -e '/^ *$/d' inputFileName 

Последний пример использовал часть регулярных выражений-метасимволов:

  • ^ Соответствует началу строки
  • $ Соответствует концу строки
  • . Соответствует любому единственному символу
  • * Соответствует нулю или более повторений предшествующего символа
  • [ ] Соответствуют одному любому из символов включённых в квадратные скобки, [ ]

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

sed — это одна из наиболее ранних команд Unix, которые позволяли обработку файлов данных из командной строки. sed развился как естественный преемник популярной команды grep. Родственный более позднему языку программирования awk, sed позволил мощную и интересную обработку данных скриптами оболочки (shell). Вероятно, sed был самым ранним инструментом Unix, который действительно поощрял адекватно использовать регулярные выражения. В терминах скорости операции, sed вообще быстрее, чем perl в исполнении, и заметно быстрее, чем awk.

sed и awk часто цитируются как прародители и вдохновители perl’а; в особенности синтаксис «s///» из примера, приведённого выше, — это часть синтаксиса perl.

У языка sed нет переменных, есть только примитив GOTO и выполняющие ветвление функциональные возможности; однако этот язык — тьюринг-полный.

GNU sed включает несколько новых особенностей таких, как замещающая правка файлов (то есть, замена оригинального файла результатом применения программы sed). Замещающая правка часто используется вместо сценария ed: например,

   sed -i 's/abc/def/' file

может использоваться вместо

   ed file
   1,$ s/abc/def/
   w
   q


Есть расширенная версия sed, называемая Super-sed (ssed), которая включает регулярные выражения, совместимые с perl.

Содержание

Ссылки

Англоязычные

Русскоязычные

Примеры использования


 
Начальная страница  » 
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ы Э Ю Я
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 Home