sed - sed

редактировать
Стандартная утилита UNIX для редактирования потоков данных
sed
Paradigm создание сценариев
Разработано Ли Э. МакМахон
Впервые появилось1974; 46 лет назад (1974)
Язык реализацииC
Веб-сайтwww.gnu.org / software / sed /
Под влиянием
Под влиянием
Chomski, Perl, AWK

sed («потоковый редактор») - это Unix утилита, которая анализирует и преобразует текст с помощью простого, компактный язык программирования. sed был разработан с 1973 по 1974 год Ли Э. МакМахоном из Bell Labs, и сегодня доступен для большинства операционных систем. sed был основан на скриптовых возможностях интерактивного редактора («редактор», 1971 г.) и более раннего («быстрый редактор», 1965–66). sed был одним из первых инструментов для поддержки регулярных выражений и до сих пор используется для обработки текста, особенно с командой подстановки. Популярные альтернативные инструменты для обработки строк открытого текста и «редактирования потока» включают AWK и Perl.

Содержание
  • 1 История
  • 2 Режим работы
  • 3 Использование
    • 3.1 Команда подстановки
    • 3.2 Другие команды sed
    • 3.3 Использование sed в качестве фильтра
    • 3.4 Сценарии sed на основе файлов
    • 3.5 Редактирование на месте
  • 4 Примеры
    • 4.1 Здравствуйте, мир! пример
    • 4.2 Другие простые примеры
    • 4.3 Пример многострочной обработки
  • 5 Ограничения и альтернативы
  • 6 См. также
  • 7 Примечания
  • 8 Ссылки
  • 9 Дополнительная литература
  • 10 Внешние ссылки
    • 10.1 Учебники
    • 10.2 Примеры
    • 10.3 Другие ссылки
История

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

GNU sed добавил несколько новых функций, включая редактирование на месте файлов. Super-sed - это расширенная версия sed, которая включает регулярные выражения, совместимые с Perl. Другой вариант sed - миниатюрный, первоначально реконструированный из 4.1BSD sed Эриком С. Раймондом и в настоящее время поддерживаемый. minised использовался GNU Project до тех пор, пока проект 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 -подобную функциональность ветвления; тем не менее, язык полный по Тьюрингу, и эзотерические сценарии sed существуют для таких игр, как сокобан, арканоид, шахматы и tetris.

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

10q

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

Использование

Команда замены

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

sed 's / regexp / replace / g' inputFileName>outputFileName

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

Команда подстановки, которая берет начало в поиске и замене в ed, реализует простой синтаксический анализ и создание шаблонов. Регулярное выражение обеспечивает как сопоставление с образцом, так и сохранение текста с помощью подвыражений, в то время как заменаможет быть либо буквальным текстом, либо строкой формата, содержащей символы идля «полное совпадение» или специальные escape-последовательности с \1по \ 9для n-го сохраненного подвыражения. Например, sed -r "s / (cat | dog) s? / \ 1s / g"заменяет все вхождения "cat" или "dog" на "cats" или "dogs" без дублирования существующий "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

Сценарии sed на основе файлов

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

sed - f subst.sed inputFileName>outputFileName

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

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

#! / Bin / sed -fs / x / y / g

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

chmod u + x subst.sed

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

subst.sed inputFileName>outputFileName

В -place edit

Опция -i, представленная в GNU sed, позволяет редактировать файлы на месте (фактически, в фоновом режиме создается временный выходной файл, а затем исходный файл заменяется временным файлом). Например:

sed -i 's / abc / def /' fileName
Примеры

Привет, мир! example

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

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

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

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

Другие простые примеры

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

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

sed -is / yourpassword / REDACTED /./status.freenode. log

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

/ yourword / d

Чтобы удалить все вхождения слова "yourword":

s / yourword // g

Для одновременного удаления двух слов из файла:

s / firstword // gs / secondword // g

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

sed "s / firstword // g; s / secondword // g" inputFileName

Пример многострочной обработки

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

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

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

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

Сценарий:

N s / \ n / / PD

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

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

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

sed 'N; с / \ п / /; П; D 'inputFileName
Ограничения и альтернативы

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

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

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

См. Также
Примечания
Ссылки
Дополнительная литература
Внешние ссылки
Викиучебники содержат книгу по тема: Sed

Учебники

Примеры

Другие ссылки

Последняя правка сделана 2021-06-07 08:36:03
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте