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.
Впервые появившись в версии 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
в строке формата заменяет это на вывод.
Помимо подстановки, возможны и другие формы простой обработки с использованием примерно 25 команд sed. Например, в следующем примере команда d используется для удаления строк, которые либо пустые, либо содержат только пробелы:
sed '/ ^ * $ / d' inputFileName
В этом примере используются некоторые из следующих регулярных выражений метасимволы (sed поддерживает полный диапазон регулярных выражений):
^
) соответствует началу строки.$
) соответствует концу строки.*
) соответствует нулю или более вхождений предыдущего символа.+
) соответствует одному или нескольким вхождениям предыдущего символа.?
) соответствует нулю или одному вхождению предыдущего символа..
) соответствует ровно одному символу.Возможны сложные конструкции sed, что позволяет использовать его в качестве простого, но узкоспециализированного языка программирования. Например, потоком управления можно управлять с помощью метки (двоеточие, за которым следует строка) и инструкции перехода b
. Инструкция b
, за которой следует допустимое имя метки, переместит обработку в блок, следующий за этой меткой.
В Unix sed часто используется как фильтр в конвейере :
generateData | sed 's / x / y / g'
То есть программа, такая как "generateData", генерирует данные, а затем sed делает небольшое изменение, заменяя x на y. Например:
$ echo xyz xyz | sed 's / x / y / g' yyz yyz
Часто бывает полезно поместить несколько команд 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
Опция -i
, представленная в GNU sed, позволяет редактировать файлы на месте (фактически, в фоновом режиме создается временный выходной файл, а затем исходный файл заменяется временным файлом). Например:
sed -i 's / abc / def /' fileName
# преобразовать входной текстовый поток в "Hello, world!" s /.*/ Привет, мир! / q
Этот сценарий «Привет, мир!» находится в файле (например, script.txt) и вызывается с помощью сценария sed -f. txt inputFileName
, где «inputFileName» - это входной текстовый файл. Сценарий изменяет строку №1 "inputFileName" на "Hello, world!" а затем завершает работу, выводя результат до выхода из sed. Любые строки ввода после строки №1 не читаются и не печатаются. Таким образом, единственный вывод - «Привет, мир!».
В этом примере подчеркиваются многие ключевые характеристики sed:
#
).s
(замена) - самая важная команда sed.q
(выход).. *
(ноль или более любых символов).Ниже следуют различные сценарии 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 |
sed
- Справочник по командам и утилитам, Единая спецификация UNIX, выпуск 7 из The Open Group sed (1)
– Plan 9 Руководство программиста, том 1