но
Парадигма | сценарии |
---|---|
Разработано | Ли Э. МакМахон |
Впервые появился | 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' имя_входного_файла > имя_выходного_файла
В некоторых версиях 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' имя_входного_файла
В этом примере используются некоторые из следующих регулярных выражений метасимволов (sed поддерживает полный диапазон регулярных выражений):
- Каре (
^
) соответствует началу строки. - доллара Знак (
$
) соответствует концу строки. - Звездочка (
*
) соответствует нулю или более вхождениям предыдущего символа. - Плюс (
+
) соответствует одному или нескольким вхождениям предыдущего символа. - вопроса Знак (
?
) соответствует нулю или одному вхождению предыдущего символа. - Точка (
.
) соответствует ровно одному символу.
Возможны сложные конструкции sed, позволяющие ему служить простым, но узкоспециализированным языком программирования . Например, потоком управления можно управлять с помощью метки ( двоеточие, за которым следует строка) и инструкции ветвления. b
, а также условный переход t
. Инструкция b
за которым следует допустимое имя метки, обработка перейдет к команде, следующей за этой меткой. t
инструкция сделает это только в том случае, если после предыдущей замены произошла успешная замена. t
(или старт программы, в случае первого t
столкнулся). Кроме того, {
Инструкция запускает подпоследовательность команд (вплоть до соответствующего }
); в большинстве случаев это будет обусловлено шаблоном адреса.
sed используется как фильтр [ править ]
В Unix sed часто используется в качестве фильтра в конвейере :
$ генерировать данные | sed 's/x/y/g'
То есть такая программа, как «generateData», генерирует данные, а затем sed вносит небольшое изменение, заменяя x на y . Например:
$ эхо xyz xyz | sed 's/x/y/g'
yyz yyz
Сценарии sed на основе файлов [ править ]
Часто бывает полезно поместить несколько команд sed, по одной команде в строку, в файл сценария, например: subst.sed
, а затем используйте -f
возможность запуска команд (например, s/x/y/g
) из файла:
sed -f subst.sed имя_входного_файла > имя_выходного_файла
В файл сценария можно поместить любое количество команд, а использование файла сценария также позволяет избежать проблем с экранированием оболочки или подстановками.
Такой файл сценария можно сделать исполняемым непосредственно из командной строки, добавив к нему « строку shebang », содержащую команду sed, и назначив файлу разрешение на выполнение. Например, файл subst.sed
может быть создан с содержимым:
#!/bin/sed -f
s / x / y / g
Затем файл может быть сделан исполняемым для текущего пользователя с помощью команды chmod
команда:
chmod u+x subst.sed
Затем файл можно выполнить непосредственно из командной строки:
subst.sed имя_входного_файла > имя_выходного_файла
Редактирование на месте [ править ]
The -i
Опция, представленная в GNU sed, позволяет редактировать файлы на месте (фактически в фоновом режиме создается временный выходной файл, а затем исходный файл заменяется временным файлом). Например:
sed -i 's/abc/def/' имя_файла
Примеры [ править ]
Привет, мир! пример [ править ]
# конвертируем входной текстовый поток в "Hello, world!"
s /.*/ Привет , мир! /
д
Это «Привет, мир!» сценарий находится в файле (например, 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/вашпароль/УДАЛЕНО/" ./status.chat.log
Чтобы удалить любую строку, содержащую слово «ваше слово» ( адрес — «/ваше слово/»):
/ твое слово / д
Чтобы удалить все вхождения слова «ваше слово»:
с / ваше слово // г
Чтобы удалить два слова из файла одновременно:
s / первое слово // g
s / второе слово // g
Чтобы выразить предыдущий пример в одной строке, например, при вводе в командной строке, можно объединить две команды точкой с запятой:
$ sed "s/firstword//g; s/ Secondword//g" inputFileName
Пример многострочной обработки [ править ]
В следующем примере sed, который обычно работает только с одной строкой, удаляет символы новой строки из предложений, где вторая строка начинается с одного пробела. Рассмотрим следующий текст:
Это моя собака, которого зовут Фрэнк. Это моя рыба, которого зовут Джордж. Это моя коза, которого зовут Адам.
Приведенный ниже сценарий sed превратит приведенный выше текст в следующий текст. Обратите внимание, что скрипт влияет только на строки ввода, начинающиеся с пробела:
Это моя собака, которую зовут Фрэнк. Это моя рыба, которого зовут Джордж. Это мой козел, которого зовут Адам.
Сценарий:
Н
s / \n / /
P
D
Это объясняется так:
- (
N
) добавить следующую строку в пространство шаблонов; - (
s/\n / /
) найти новую строку, за которой следует пробел, заменить одним пробелом; - (
P
) напечатайте верхнюю строку пространства шаблонов; - (
D
) удалите верхнюю строку из пространства шаблонов и снова запустите скрипт.
Это можно выразить в одной строке через точку с запятой:
но' N; s/\n / /; P; D
' имя_входного_файла
Ограничения и альтернативы [ править ]
Несмотря на простоту и ограниченность, 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 г.
- ^ Перейти обратно: а б Макилрой, доктор медицины (1987). Читатель Research Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (Технический отчет). CSTR. Лаборатории Белла. 139.
- ^ Перейти обратно: а б с д
«О ранней истории и влиянии 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 году.