но
![]() Отрывок из справочной страницы GNU sed | |
Парадигма | сценарии |
---|---|
Разработано | Ли Э. МакМахон |
Впервые появился | 1974 год |
Язык реализации | С |
Под влиянием | |
Эд | |
Под влиянием | |
Перл , АВК |
sed («редактор потока») — это утилита Unix , которая анализирует и преобразует текст, используя простой и компактный язык программирования. Он был разработан с 1973 по 1974 год Ли Э. МакМахоном из Bell Labs . [1] и сегодня доступен для большинства операционных систем. [2] sed был основан на функциях сценариев интерактивного редактора ed («редактор», 1971 г.) и более раннего qed («быстрый редактор», 1965–66 гг.). Это был один из первых инструментов для поддержки регулярных выражений , который до сих пор используется для обработки текста, особенно с помощью команды подстановки. Популярные альтернативные инструменты для манипулирования строками открытого текста и «потокового редактирования» включают AWK и Perl .
История [ править ]
Впервые появившись в версии 7 Unix , [3] sed — одна из первых команд Unix, созданная для обработки файлов данных в командной строке. Она возникла как естественный преемник популярной команды grep . [4] Первоначальной мотивацией был аналог grep (g/re/p) для замены, отсюда и «g/re/s». [3] Предвидя, что для каждой команды также возникнут дополнительные программы специального назначения, такие как g/re/d, МакМахон написал универсальный построчно-ориентированный потоковый редактор, который стал sed. [4] Синтаксис sed, особенно использование /
для сопоставления с образцом и s///
для замены, созданной ed , предшественником sed, который широко использовался в то время, [4] а синтаксис регулярных выражений повлиял на другие языки, особенно ECMAScript и Perl . Позже был разработан более мощный язык AWK , который функционировал как двоюродный брат, позволяя выполнять мощную обработку текста с помощью сценариев оболочки . sed и AWK часто называют прародителями и вдохновителями Perl, они повлияли на синтаксис и семантику Perl, особенно на операторы сопоставления и замены.
В GNU sed добавлено несколько новых функций, включая на месте редактирование файлов . Super-sed — это расширенная версия sed, включающая регулярные выражения, совместимые с Perl . Другой вариант sed — minised , первоначально созданный путем реверс-инжиниринга из 4.1BSD, созданный Эриком С. Рэймондом и в настоящее время поддерживаемый Рене Ребе . minised использовался проектом GNU до тех пор, пока проект GNU не написал новую версию sed на основе новой библиотеки регулярных выражений GNU. Текущая мини-версия содержит некоторые расширения для BSD sed, но не так многофункциональна, как GNU sed. Его преимущество в том, что он очень быстрый и использует мало памяти. Он используется во встроенных системах и представляет собой версию sed, поставляемую с Minix . [5]
Режим работы [ править ]
sed — это утилита построчно-ориентированной обработки текста: она считывает текст построчно из входного потока или файла во внутренний буфер, называемый пространством шаблонов . Каждое чтение строки запускает цикл . К пространству шаблонов sed применяет одну или несколько операций, указанных в сценарии sed . sed реализует язык программирования , содержащий около 25 команд , определяющих операции с текстом. Для каждой входной строки после запуска сценария sed обычно выводит пространство шаблонов (строку, измененную сценарием) и снова начинает цикл со следующей строки. Другие варианты поведения в конце сценария доступны через параметры sed и команды сценария, например d
чтобы удалить пространство шаблонов, q
бросить курить, N
для немедленного добавления следующей строки в пространство шаблонов и т. д. Таким образом, сценарий sed соответствует телу цикла, который проходит по строкам потока, где сам цикл и переменная цикла (текущий номер строки) являются неявными и поддерживаются sed.
Сценарий sed можно указать в командной строке ( -e
вариант) или читать из отдельного файла ( -f
вариант). Команды в сценарии sed могут принимать необязательный адрес в виде номеров строк или регулярных выражений . Адрес определяет, когда выполняется команда. Например, 2d
будет только запускать d
(удалить) во второй строке ввода (печать всех строк, кроме второй), а /^ /d
удалит все строки, начинающиеся с пробела. Отдельный специальный буфер, пространство хранения , может использоваться несколькими командами sed для хранения и накопления текста между циклами. командный язык sed имеет только две переменные («пространство хранения» и «пространство шаблонов») и GOTO функциональность ветвления, подобную ; тем не менее, язык является Тьюринг-полным , [6] [7] и эзотерические sed-скрипты существуют для таких игр, как sokoban , arkanoid , [8] шахматы , [9] и тетрис . [10]
Основной цикл выполняется для каждой строки входного потока, оценивая сценарий sed в каждой строке входного потока. Каждая строка сценария sed представляет собой пару шаблон-действие, указывающую, какой шаблон сопоставить и какое действие выполнить, что можно преобразовать в условный оператор . Поскольку основной цикл, рабочие переменные (пространство шаблонов и пространство хранения), потоки ввода и вывода, а также действия по умолчанию (копирование строки в пространство шаблонов, печать пространства шаблонов) неявны, можно писать краткие однострочные программы . Например, программа sed, заданная:
10q
напечатает первые 10 строк ввода, а затем остановится.
Использование [ править ]
Команда замены [ править ]
В следующем примере показано типичное и наиболее распространенное использование sed: подстановка. Это использование действительно было первоначальной мотивацией для sed: [4]
sed 's/regexp/replacement/g' inputFileName > outputFileName
В некоторых версиях sed перед выражением должен стоять -e
чтобы указать, что за ним следует выражение. s
означает замену, а g
означает глобальный, что означает, что все соответствующие вхождения в строке будут заменены. ( Регулярное выражение т. е. шаблон), по которому осуществляется поиск, помещается после первого символа-разделителя (здесь косая черта), а замена следует за вторым символом. Слэш ( /
) — это общепринятый символ, происходящий от символа «поиск» в ed, но можно использовать любой другой, чтобы сделать синтаксис более читабельным, если он не встречается в шаблоне или замене; это полезно, чтобы избежать « синдрома наклоненной зубочистки ».
Команда подстановки, берущая начало в search-and-replace в ed, реализует простой синтаксический анализ и создание шаблонов . regexp
обеспечивает как сопоставление с образцом, так и сохранение текста с помощью подвыражений, в то время как replacement
может быть либо буквальным текстом, либо строкой формата, содержащей символы &
для «всего совпадения» или специальных 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
, а также условный переход t
. Инструкция b
за которым следует допустимое имя метки, обработка перейдет к команде, следующей за этой меткой. t
инструкция сделает это только в том случае, если после предыдущей замены произошла успешная замена. t
(или старт программы, в случае первого t
столкнулся). Кроме того, {
Инструкция запускает подпоследовательность команд (вплоть до соответствующего }
); в большинстве случаев это будет обусловлено шаблоном адреса.
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 -f
s/x/y/g
Затем файл может быть сделан исполняемым для текущего пользователя с помощью команды chmod
команда:
chmod u+x subst.sed
Затем файл можно выполнить непосредственно из командной строки:
subst.sed inputFileName > outputFileName
Редактирование на месте [ править ]
The -i
Опция, представленная в GNU sed, позволяет редактировать файлы на месте (фактически в фоновом режиме создается временный выходной файл, а затем исходный файл заменяется временным файлом). Например:
sed -i 's/abc/def/' fileName
Примеры [ править ]
Привет, мир! пример [ править ]
# convert input text stream to "Hello, world!"
s/.*/Hello, world!/
q
Это «Привет, мир!» сценарий находится в файле (например, script.txt) и вызывается с помощью sed -f script.txt inputFileName
, где «inputFileName» — входной текстовый файл. Скрипт меняет строку №1 «inputFileName» на «Hello, world!» а затем завершает работу, печатая результат перед завершением работы sed. Любые строки ввода после строки №1 не читаются и не печатаются. Таким образом, единственный вывод — «Привет, мир!».
В примере подчеркиваются многие ключевые характеристики sed:
- Типичные программы sed довольно короткие и простые.
- Сценарии sed могут иметь комментарии (строка, начинающаяся с
#
символ). - The
s
Команда (замена) — самая важная команда sed. - sed позволяет простое программирование с помощью таких команд, как
q
(покидать). - sed использует регулярные выражения, такие как
.*
(ноль или более любых символов).
Другие простые примеры [ править ]
Ниже приведены различные сценарии sed; их можно выполнить, передав в качестве аргумента sed, или поместить в отдельный файл и выполнить через -f
или сделав сам скрипт исполняемым.
Чтобы заменить любой экземпляр определенного слова в файле на «УДАЛЕНО», например пароль IRC, и сохранить результат:
$ sed -i "s/yourpassword/REDACTED/" ./status.chat.log
Чтобы удалить любую строку, содержащую слово «ваше слово» ( адрес — «/ваше слово/»):
/yourword/ d
Чтобы удалить все вхождения слова «ваше слово»:
s/yourword//g
Чтобы удалить два слова из файла одновременно:
s/firstword//g
s/secondword//g
Чтобы выразить предыдущий пример в одной строке, например, при вводе в командной строке, можно объединить две команды точкой с запятой:
$ sed "s/firstword//g; s/secondword//g" inputFileName
Пример многострочной обработки [ править ]
В следующем примере sed, который обычно работает только с одной строкой, удаляет символы новой строки из предложений, где вторая строка начинается с одного пробела. Рассмотрим следующий текст:
This is my dog, whose name is Frank. This is my fish, whose name is George. This is my goat, whose name is Adam.
Приведенный ниже сценарий sed превратит приведенный выше текст в следующий текст. Обратите внимание, что скрипт влияет только на строки ввода, начинающиеся с пробела:
This is my dog, whose name is Frank. This is my fish, whose name is George. This is my goat, whose name is Adam.
Сценарий:
N
s/\n / /
P
D
Это объясняется так:
- (
N
) добавить следующую строку в пространство шаблонов; - (
s/\n / /
) найти новую строку, за которой следует пробел, заменить одним пробелом; - (
P
) напечатайте верхнюю строку пространства шаблонов; - (
D
) удалите верхнюю строку из пространства шаблонов и снова запустите скрипт.
Это можно выразить в одной строке через точку с запятой:
sed 'N; s/\n / /; P; D
' inputFileName
Ограничения и альтернативы [ править ]
Несмотря на простоту и ограниченность, sed является достаточно мощным для большого количества целей. Для более сложной обработки более мощные языки, такие как AWK или Perl вместо этого используются . Они особенно используются при преобразовании строки более сложным способом, чем извлечение регулярного выражения и замена шаблона, хотя в принципе возможны сколь угодно сложные преобразования с использованием буфера хранения.
И наоборот, для более простых операций используются специализированные утилиты Unix, такие как grep (печать строк, соответствующих шаблону), head (печать первой части файла), Tail (печать последней части файла) и tr (перевод или удаление символов). зачастую предпочтительнее. Для решения конкретных задач такие специализированные утилиты обычно проще, понятнее и быстрее, чем более общее решение, такое как sed.
Команды и синтаксис ed/sed продолжают использоваться в дочерних программах, таких как текстовые редакторы vi и vim . Аналогом ed/sed является sam /ssam, где sam — редактор Plan 9 , а ssam — потоковый интерфейс к нему, обеспечивающий функциональность, аналогичную sed.
См. также [ править ]
Примечания [ править ]
- ^
При использовании командной строки кавычки вокруг выражения не обязательны и необходимы только в том случае, если в противном случае оболочка не интерпретировала бы выражение как одно слово (токен). Для сценария
s/x/y/g
нет никакой двусмысленности, поэтомуgenerateData | sed s/x/y/g
работает правильно. Однако кавычки обычно включаются для ясности и часто необходимы, особенно для пробелов (например,'s/x x/y y/'
). Чаще всего используются одинарные кавычки, чтобы избежать интерпретаций оболочки.$
как переменная оболочки. Используются двойные кавычки, например"s/$1/$2/g"
, чтобы позволить оболочке заменить аргумент командной строки или другую переменную оболочки.
Ссылки [ править ]
- ^ «Часто задаваемые вопросы по sed, раздел 2.1» . Архивировано из оригинала 27 июня 2018 г. Проверено 21 мая 2013 г.
- ^ «Часто задаваемые вопросы по sed, раздел 2.2» . Архивировано из оригинала 27 июня 2018 г. Проверено 21 мая 2013 г.
- ^ Jump up to: Перейти обратно: а б Макилрой, доктор медицины (1987). Читатель Research Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (Технический отчет). CSTR. Лаборатории Белла. 139.
- ^ Jump up to: Перейти обратно: а б с д
«О ранней истории и влиянии Unix» .
Спустя некоторое время на замену возникла потребность в другой специальной программе — gres: g/re/s. Ли МакМэхон взялся написать ее и вскоре предвидел, что семейству не будет конца: г/ре/д, г/ре/а и т. д. По мере развития его концепции она стала сед…
- ^ Рэймонд, Эрик Стивен ; Ребе, Рене (3 марта 2017 г.). «tar-mirror/minized: меньшая, дешевая и быстрая реализация SED» . Гитхаб . Архивировано из оригинала 13 июня 2018 г. Проверено 20 мая 2024 г.
- ^ «Реализация машины Тьюринга как сценария Sed» . Архивировано из оригинала 20 февраля 2018 г. Проверено 24 апреля 2003 г.
- ^ "Тьюринг.сед" . Архивировано из оригинала 16 января 2018 г. Проверено 24 апреля 2003 г.
- ^ «Дом $SED — геймез» .
- ^ "bolknote/SedChess" . Гитхаб . Проверено 23 августа 2013 г.
- ^ «Sedtris, игра тетрис, написанная для sed» . Гитхаб . Проверено 3 октября 2016 г.
Дальнейшее чтение [ править ]
- Восьмое издание Bell Lab (около 1985 г.), страница руководства Unix sed(1)
- Документация GNU sed или страница руководства
- Дейл Догерти и Арнольд Роббинс (март 1997 г.). sed & awk (2-е изд.). О'Рейли . ISBN 1-56592-225-5 .
- Арнольд Роббинс (июнь 2002 г.). Карманный справочник sed и awk (2-е изд.). О'Рейли . ISBN 0-596-00352-8 .
- Питер Пэтсис (декабрь 1998 г.). Интерактивная рабочая тетрадь программиста UNIX AWK и SED (Интерактивная рабочая тетрадь UNIX) . Прентис Холл . ISBN 0-13-082675-8 .
- Дэниел Голдман (февраль 2013 г.). Полное руководство по sed . ЕХДП Пресс. ISBN 978-1-939824-00-4 .
- Sourceforge.net , часто задаваемые вопросы по sed (март 2003 г.)
Внешние ссылки [ править ]

- Единая спецификация UNIX , версия 4 от Open Group. – Справочник по оболочке и утилитам,
- Plan 9 , том 1 Руководство программиста –
- Sed — Введение и руководство , Брюс Барнетт
- «Домашняя страница GNU sed» . (включая руководство)
- Эрик Пемент (2004). "отправить редактор потока" .
- Эрик С. Рэймонд . «минимизированная реализация sed» . Точный КОД .
- Кроссплатформенное программное обеспечение
- Языки программирования сопоставления шаблонов
- Языки сценариев
- Стандартные программы Unix
- Текстоориентированные языки программирования
- Утилиты обработки текста Unix
- Утилиты Unix SUS2008
- Команды Плана 9
- Команды IBM i Qshell
- Консольные приложения
- Языки программирования, созданные в 1974 году.