Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

sed («потоковый редактор») - это утилита Unix, которая анализирует и преобразует текст, используя простой и компактный язык программирования. СЕПГ был разработан с 1973 по 1974 г. Ли Э. McMahon из Bell Labs , [1] и доступен сегодня для большинства операционных систем. [2] sed был основан на скриптовых возможностях интерактивного редактора ed («редактор», 1971) и более раннего qed («быстрый редактор», 1965–66). sed был одним из первых инструментов для поддержки регулярных выражений и до сих пор используется для обработки текста, особенно с командой подстановки. Популярные альтернативные инструменты для обработки строк открытого текста и "потокового редактирования"включатьAWK и Perl .

История [ править ]

[3] sed, впервые появившийся в версии 7 Unix , является одной из первых команд Unix, созданных для обработки файлов данных из командной строки. Он превратился в естественного преемника популярной команды grep . [4] Первоначальная мотивация была аналогом grep (g / re / p) для подстановки, отсюда «g / re / s». [3] Предвидя, что появятся и другие специализированные программы для каждой команды, такие как g / re / d, МакМахон написал универсальный строчно-ориентированный потоковый редактор, который стал sed. [4] Синтаксис sed, в частности, использование для сопоставления с образцом и для подстановки, происходит от ed/s///, предшественник sed, который широко использовался в то время [4], а синтаксис регулярных выражений повлиял на другие языки, особенно на ECMAScript и Perl . Позже был разработан более мощный язык AWK , который функционировал как двоюродные братья, позволяя выполнять мощную обработку текста с помощью сценариев оболочки . sed и AWK часто называют прародителями и вдохновителями Perl, оказавшими влияние на синтаксис и семантику Perl, особенно в операторах сопоставления и подстановки.

GNU sed добавил несколько новых функций, включая редактирование файлов на месте. Super-sed - это расширенная версия sed, которая включает регулярные выражения, совместимые с Perl . Другой вариант sed - это миниатюрный , первоначально реконструированный из 4.1BSD sed Эриком С. Реймондом и в настоящее время поддерживаемый Рене Ребе . minised использовался проектом GNU до тех пор, пока проект GNU не написал новую версию sed, основанную на новой библиотеке регулярных выражений GNU. Текущая версия minised содержит некоторые расширения для BSD sed, но не так многофункциональна, как GNU sed. Его преимущество в том, что он очень быстрый и использует мало памяти. [необходимая ссылка ]Он используется во встроенных системах и является версией sed, поставляемой сMinix. [ необходима цитата ]

Режим работы [ править ]

sed - это утилита для построчной обработки текста: она считывает текст построчно из входного потока или файла во внутренний буфер, называемый пространством шаблонов . Каждая прочитанная строка запускает цикл . К пространству шаблонов sed применяет одну или несколько операций, указанных в сценарии sed . sed реализует язык программирования примерно с 25 командами, которые определяют операции с текстом. Для каждой строки ввода после запуска сценария sed обычно выводит пространство шаблонов (строку, измененную сценарием) и снова начинает цикл со следующей строки. Другие варианты поведения в конце сценария доступны с помощью параметров sed и команд сценария, напримерdдля удаления пространства шаблонов, qдля выхода, Nдля немедленного добавления следующей строки в пространство шаблонов и т. д. Таким образом, сценарий sed соответствует телу цикла, который выполняет итерацию по строкам потока, где сам цикл и переменная цикла (текущий номер строки) неявны и поддерживаются sed.

Сценарий sed можно указать в командной строке ( -eопция) или прочитать из отдельного файла ( -fопция). Команды в сценарии sed могут принимать необязательный адрес в виде номеров строк или регулярных выражений . Адрес определяет, когда запускается команда. Например, 2dкоманда d(удалить) будет запущена только во второй строке ввода (печать всех строк, кроме второй), а /^ /dвсе строки, начинающиеся с пробела , будут удалены. Отдельный специальный буфер, пространство хранения , может использоваться несколькими командами sed для хранения и накопления текста между циклами. Командный язык sed имеет только две переменные ("удерживаемое пространство" и "пространство шаблонов") и GOTO-подобная функциональность ветвления; тем не менее, язык является Тьюринг-полным , [5] [6] и эзотерические существуют SED сценарии для игр , таких как Sokoban , Арканоид , [7] шахматы , [8] и тетрис . [9]

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

10q

напечатает первые 10 строк ввода, затем остановится.

Использование [ править ]

Команда замены [ править ]

В следующем примере показано типичное и наиболее распространенное использование sed: substitution. Это использование действительно было изначальной мотивацией для sed: [4]

sed 's / регулярное выражение / замена / g' inputFileName> outputFileName

В некоторых версиях sed перед выражением должен стоять -eзнак, чтобы указать, что за ним следует выражение. Знак sозначает замену, а gзнак - глобальный, что означает, что все совпадающие вхождения в строке будут заменены. Регулярное выражение (т.е. образца) для поиска помещаются после первого символа ограничительного (слэш здесь) и замена следует второму символу. Косая черта ( /) - это общепринятый символ, происходящий от символа "поиска" в ed, но можно использовать любой другой, чтобы сделать синтаксис более читаемым, если он не встречается в шаблоне или замене; это полезно, чтобы избежать « синдрома опущенной зубочистки ».

Команда подстановки, которая берет начало в поиске и замене в ed, реализует простой синтаксический анализ и создание шаблонов . regexpОбеспечивает как сопоставление с образцом и сохранением текста через подвыражение, в то время как replacementможет быть или буквенным текст, или строка формата , содержащая символы &для «всего матча» или специальных управляющих последовательностями \1 через \9для п - го сохраненного подвыражения. Например, sed -r "s/(cat|dog)s?/\1s/g"заменяет все вхождения «кот» или «собака» на «кошки» или «собаки» без дублирования существующего «s»: (cat|dog)это первое (и единственное) сохраненное подвыражение в регулярном выражении и \1в формате строка подставляет это в вывод.

Другие команды sed [ править ]

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

sed '/ ^ * $ / d' inputFileName

В этом примере используются некоторые из следующих метасимволов регулярных выражений (sed поддерживает полный диапазон регулярных выражений):

  • Каретка ( ^) соответствует началу строки.
  • Знак доллара ( $) соответствует концу строки.
  • Звездочка ( *) соответствует нулю или более вхождений предыдущего символа.
  • Плюс ( +) соответствует одному или несколько возникновению (ы) предыдущего символа.
  • Знак вопроса ( ?) соответствует нулю или одному вхождению предыдущего символа.
  • Точка ( .) точно соответствует одному символу.

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

sed используется как фильтр [ править ]

В Unix sed часто используется как фильтр в конвейере :

generateData | sed 's / x / y / g'

То есть программа, такая как "generateData", генерирует данные, а затем sed делает небольшое изменение, заменяя x на y . Например:

$ echo xyz xyz | sed 's / x / y / g' yyz yyz

[примечания 1]

Скрипты sed на основе файлов [ править ]

Часто бывает полезно поместить несколько команд sed, по одной команде на строку, в файл сценария, например subst.sed, а затем использовать -fпараметр для запуска команд (например, s/x/y/g) из файла:

sed -f subst.sed имя_файла ввода> имя_файла вывода

В файл сценария можно поместить любое количество команд, и использование файла сценария также позволяет избежать проблем с экранированием оболочки или заменами.

Такой файл сценария можно сделать непосредственно исполняемым из командной строки, добавив к нему « строку shebang », содержащую команду sed, и назначив этому файлу разрешение на выполнение. Например, можно создать файл subst.sedс содержимым:

#! / bin / sed -fс / х / у / г

Затем текущий пользователь может сделать файл исполняемым с помощью chmodкоманды:

chmod u + x subst.sed

Затем файл можно запустить прямо из командной строки:

subst.sed inputFileName> outputFileName

Редактирование на месте [ править ]

-iВариант, введенный в GNU СЭД, позволяет на месте редактирования файлов ( на самом деле, временный выходной файл создается в фоновом режиме, а затем исходный файл заменяется временным файлом). Например:

sed -i 's / abc / def /' имя_файла

Примеры [ править ]

Привет мир! пример [ править ]

# преобразовать входной текстовый поток в "Hello, world!"с /.*/ Привет, мир! /q

Это "Привет, мир!" сценарий находится в файле (например, script.txt) и вызывается с помощью sed -f script.txt inputFileName, где "inputFileName" - это входной текстовый файл. Сценарий изменяет строку №1 "inputFileName" на "Hello, world!" а затем завершает работу, выводя результат до выхода из команды sed. Любые строки ввода после строки №1 не читаются и не печатаются. Таким образом, единственный вывод - «Привет, мир!».

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

  • Типичные программы sed довольно короткие и простые.
  • Скрипты sed могут иметь комментарии (строка, начинающаяся с #символа).
  • Команда s(подстановка) - самая важная команда sed.
  • sed позволяет простое программирование с такими командами, как q(quit).
  • sed использует регулярные выражения, такие как .*(ноль или более любых символов).

Другие простые примеры [ править ]

Ниже следуют различные сценарии sed; они могут быть выполнены путем передачи в качестве аргумента в sed или помещены в отдельный файл и выполнены через -fили сделав сам скрипт исполняемым.

Чтобы заменить любой экземпляр определенного слова в файле на «УДАЛЕНО», например пароль IRC, и сохранить результат:

sed -is / yourpassword / УДАЛЕНО / ./status.freenode.log

Чтобы удалить любую строку, содержащую слово «ваше слово» ( адрес : «/ ваше слово /»):

/ yourword / d

Чтобы удалить все вхождения слова «ваше слово»:

s / yourword // g

Чтобы удалить два слова из файла одновременно:

s / первое слово // gs / второе слово // g

Чтобы выразить предыдущий пример в одной строке, например, при вводе в командной строке, можно объединить две команды через точку с запятой:

sed "s / первое слово // g; s / второе слово // g" inputFileName

Пример многострочной обработки [ править ]

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

Это моя собака, чье имя Фрэнк.Это моя рыба,чье имя Джордж.Это моя коза, которого зовут Адам.

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

Это моя собака по имени Фрэнк.Это моя рыба,чье имя Джордж.Это мой козел, которого зовут Адам.

Сценарий такой:

Nс / \ п / /пD

Это объясняется следующим образом:

  • ( N) добавить следующую строку в пространство шаблонов;
  • ( s/\n / /) найти новую строку, за которой следует пробел, заменить на один пробел;
  • ( P) вывести верхнюю строку пространства шаблонов;
  • ( D) удалите верхнюю строку из пространства шаблонов и снова запустите сценарий.

Это можно выразить в одной строке через точку с запятой:

sed 'N; с / \ п / /; П; D 'inputFileName

Ограничения и альтернативы [ править ]

Несмотря на простоту и ограниченность, sed достаточно мощен для множества целей. Вместо этого для более сложной обработки используются более мощные языки, такие как AWK или Perl . Они особенно используются при преобразовании строки более сложным способом, чем извлечение регулярного выражения и замена шаблона, хотя в принципе возможны произвольно сложные преобразования с использованием буфера хранения.

И наоборот, для более простых операций используются специализированные утилиты Unix, такие как grep (печать строк, соответствующих шаблону), head (печать первой части файла), tail (печать последней части файла) и tr (перевод или удаление символов) часто предпочтительнее. Для конкретных задач, для выполнения которых они предназначены, такие специализированные утилиты обычно проще, понятнее и быстрее, чем более общее решение, такое как sed.

Команды и синтаксис ed / sed продолжают использоваться в дочерних программах, таких как текстовые редакторы vi и vim . Аналог ed / sed - sam / ssam, где sam - это редактор Plan 9 , а ssam - это потоковый интерфейс к нему, обеспечивающий функциональность, аналогичную sed.

См. Также [ править ]

  • Список команд Unix
  • AWK
  • tr (Unix)

Заметки [ править ]

  1. ^ При использовании командной строки кавычки вокруг выражения не требуются и необходимы только в том случае, если оболочка иначе не интерпретировала бы выражение как отдельное слово (токен). Для скриптаs/x/y/gнет двусмысленности, поэтомуgenerateData | sed s/x/y/gработает корректно. Однако кавычки обычно включаются для ясности и часто необходимы, особенно для пробелов (например,'s/x x/y y/'). Чаще всего используются одинарные кавычки, чтобы оболочка не интерпретировалась$как переменная оболочки. Двойные кавычки используются, например"s/$1/$2/g", чтобы позволить оболочке заменить аргумент командной строки или другую переменную оболочки.

Ссылки [ править ]

  1. ^ "Часто задаваемые вопросы по sed, раздел 2.1" . Проверено 21 мая 2013 .
  2. ^ "Часто задаваемые вопросы по sed, раздел 2.2" . Проверено 21 мая 2013 .
  3. ^ а б Макилрой, доктор медицины (1987). Читатель Research Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (технический отчет). CSTR. Bell Labs. 139.
  4. ^ a b c d "О ранней истории и влиянии Unix" . Через некоторое время возникла потребность в другой программе специального назначения - gres для замены: g / re / s. Ли МакМахон взялся написать его и вскоре предвидел, что семье не будет конца: g / re / d, g / re / a и т. Д. По мере развития его концепции она превратилась в sed…
  5. ^ «Реализация машины Тьюринга как сценарий Sed» .
  6. ^ "Turing.sed" .
  7. ^ "The $ SED Home - gamez" .
  8. ^ "bolknote / SedChess" . GitHub .
  9. ^ "Sedtris, игра в тетрис, написанная для sed" .

Дальнейшее чтение [ править ]

  • Восьмое издание Bell Lab (около 1985 г.) Unix sed (1) справочная страница
  • Страница справочника GNU sed (1)
  • Дейл Догерти и Арнольд Роббинс (март 1997 г.). sed и awk (2-е изд.). О'Рейли . ISBN 1-56592-225-5.
  • Арнольд Роббинс (июнь 2002 г.). Карманный справочник по sed и awk (2-е изд.). О'Рейли . ISBN 0-596-00352-8.
  • Питер Пацис (декабрь 1998 г.). UNIX AWK и интерактивная рабочая тетрадь программиста SED (UNIX Interactive Workbook) . Прентис Холл . ISBN 0-13-082675-8.
  • Дэниел Гольдман (февраль 2013 г.). Полное руководство по sed . EHDP Press. ISBN 978-1-939824-00-4.
  • Sourceforge.net , FAQ по sed (март 2003 г.)

Внешние ссылки [ править ]

  • sed - Справочник по командам и утилитам, спецификация Single UNIX , выпуск 7 от The Open Group
  • sed(1) -  Руководство программиста Plan 9 , том 1

Учебники [ править ]

  • Сед - Введение и учебное пособие , Брюс Барнетт
  • SED - неинтерактивный текстовый редактор (1974) , Ли Э. МакМахон
  • 31+ примеров использования команды Sed Linux в текстовом манипулировании , автор Мохтар Эбрагим

Примеры [ править ]

  • Основные источники сценариев sed, файлы, использование
  • Сценарии SED и Shell Роджера Чанга (2012)
  • Лучшие команды sed - примеры использования
  • Примеры команд Sed в Unix и Linux

Другие ссылки [ править ]

  • Домашняя страница GNU sed (включая руководство по GNU sed)
  • sed the Stream Editor (2004) (Эрик Пемент)
  • sed-users группа обсуждения Yahoo