Как использовать команду sed в Linux
Изучите основы использования sed, а затем загрузите нашу шпаргалку для быстрого ознакомления с редактором потоков Linux.
Немногие команды Unix так известны, как sed, grep и awk. Они часто группируются вместе, возможно, потому, что у них странные имена и мощные инструменты для анализа текста. Они также имеют некоторые синтаксические и логические сходства. И хотя все они полезны для анализа текста, у каждого есть свои особенности. В этой статье рассматривается команда sed
, которая является редактором потока.
Я уже писал о sed, а также о его дальнем родственнике ed. Чтобы освоиться с sed, полезно немного познакомиться с ed, потому что это поможет вам привыкнуть к идее буферов. В этой статье предполагается, что вы знакомы с самыми основами sed, то есть вы, по крайней мере, выполнили классическую команду поиска и замены в стиле s/foo/bar/
.
[Загрузите нашу бесплатную шпаргалку по sed]
Установка СЭД
Если вы используете Linux, BSD или macOS, у вас уже установлен GNU или BSD sed. Это уникальные повторные реализации исходной команды sed
, и хотя они похожи, есть небольшие различия. Эта статья была протестирована на версиях Linux и NetBSD, поэтому в этом случае вы можете использовать любой sed, который есть на вашем компьютере, хотя для sed BSD вы должны использовать короткие параметры (-n
вместо >--тихо
, например).
GNU sed обычно считается наиболее многофункциональным из доступных sed, поэтому вы можете попробовать его независимо от того, используете ли вы Linux или нет. Если вы не можете найти GNU sed (часто называемый gsed в системах, отличных от Linux) в дереве портов, вы можете загрузить его исходный код с веб-сайта GNU. Хорошая особенность установки GNU sed заключается в том, что вы можете использовать его дополнительные функции, но также ограничить его соответствием спецификациям sed POSIX, если вам потребуется переносимость.
Пользователи MacOS могут найти GNU sed на MacPorts или Homebrew.
В Windows вы можете установить GNU sed с Chocolatey.
Понимание пространства шаблонов и пространства удержания
Sed работает ровно с одной строкой за раз. Поскольку у него нет визуального отображения, он создает пространство шаблона, пространство в памяти, содержащее текущую строку из входного потока (с удалением любого завершающего символа новой строки). Как только вы заполните пространство шаблонов, sed выполнит ваши инструкции. Когда команды достигают конца, sed печатает содержимое пространства шаблонов в выходной поток. Поток вывода по умолчанию — stdout, но вывод можно перенаправить в файл или даже обратно в тот же файл с помощью параметра --in-place=.bak
.
Затем цикл начинается снова со следующей входной строки.
Чтобы обеспечить некоторую гибкость при просмотре файлов с помощью sed, sed также предоставляет пространство хранения (иногда также называемое буфером хранения), пространство в памяти sed, зарезервированное для временного хранения. хранилище данных. Вы можете думать о пространстве хранения как о буфере обмена, и на самом деле это именно то, что демонстрируется в этой статье: как копировать/вырезать и вставлять с помощью sed.
Сначала создайте образец текстового файла с этим текстом в качестве содержимого:
Line one
Line three
Line two
Копирование данных для сохранения места
Чтобы поместить что-либо в пространство хранения sed, используйте команду h
или H
. h
в нижнем регистре указывает sed перезаписать текущее содержимое пространства хранения, а H
с заглавной буквы указывает на добавление данных к тому, что уже находится в пространстве хранения.
Если использовать отдельно, смотреть особо не на что:
$ sed --quiet -e '/three/ h' example.txt
$
Параметр --quiet
(сокращенно -n
) подавляет весь вывод, кроме того, что sed выполнил для моих требований поиска. В этом случае sed выбирает любую строку, содержащую строку three
, и копирует ее, чтобы сохранить место. Я не говорил sed что-либо печатать, поэтому вывод не производится.
Копирование данных из резервной области
Чтобы получить некоторое представление о пространстве хранения, вы можете скопировать его содержимое из пространства хранения и поместить в пространство шаблонов с помощью команды g
. Посмотрите, что происходит:
$ sed -n -e '/three/h' -e 'g;p' example.txt
Line three
Line three
Печатается первая пустая строка, поскольку пространство хранения пусто при первом копировании в пространство шаблона.
Следующие две строки содержат Третью строку
, потому что именно она находится в пространстве удержания, начиная со второй строки.
Эта команда использует два уникальных сценария (-e
) исключительно для удобства чтения и организации. Может быть полезно разделить шаги на отдельные сценарии, но технически эта команда работает так же хорошо, как и один оператор сценария:
$ sed -n -e '/three/h ; g ; p' example.txt
Line three
Line three
Добавление данных в пространство шаблонов
Команда G
добавляет символ новой строки и содержимое удерживаемого пространства в пространство шаблонов.
$ sed -n -e '/three/h' -e 'G;p' example.txt
Line one
Line three
Line three
Line two
Line three
Первые две строки этого вывода содержат как содержимое пространства шаблонов (Первая строка
), так и пустое пространство хранения. Следующие две строки соответствуют тексту поиска (three
), поэтому они содержат как пространство шаблона, так и пространство хранения. Пространство удержания не меняется для третьей пары строк, поэтому пространство шаблона (Вторая строка
) печатается с пробелом удержания (по-прежнему Третья строка
) в конце. .
Вырезание и вставка с помощью sed
Теперь, когда вы знаете, как преобразовать строку из шаблона в место хранения и обратно, вы можете разработать сценарий sed, который копирует, затем удаляет, а затем вставляет строку в документ. Например, в файле примера для этой статьи Третья строка
не соответствует порядку. Сед может это исправить:
$ sed -n -e '/three/ h' -e '/three/ d' \
-e '/two/ G;p' example.txt
Line one
Line two
Line three
- Первый скрипт находит строку, содержащую строку
three
, и копирует ее из пространства шаблонов в пространство хранения, заменяя все, что в данный момент находится в пространстве хранения. - Второй скрипт удаляет любую строку, содержащую строку
three
. Это завершает эквивалент действия вырезать в текстовом процессоре или текстовом редакторе. - Последний скрипт находит строку, содержащую
two
, и добавляет содержимое пространства хранения в пространство шаблонов, а затем печатает пространство шаблонов.
Дело сделано.
Написание сценариев с помощью sed
Еще раз: использование отдельных операторов сценария предназначено исключительно для визуального и умственного упрощения. Команда вырезания и вставки работает как один скрипт:
$ sed -n -e '/three/ h ; /three/ d ; /two/ G ; p' example.txt
Line one
Line two
Line three
Его даже можно записать как отдельный файл сценария:
#!/usr/bin/sed -nf
/three/h
/three/d
/two/ G
p
Чтобы запустить сценарий, отметьте его как исполняемый и попробуйте использовать его в образце файла:
$ chmod +x myscript.sed
$ ./myscript.sed example.txt
Line one
Line two
Line three
Конечно, чем более предсказуем текст, который вам нужно разобрать, тем проще решить вашу проблему с помощью sed. Обычно непрактично изобретать «рецепты» для действий sed (например, копирование и вставка), поскольку условие запуска действия, вероятно, отличается от файла к файлу. Однако чем лучше вы владеете командами sed, тем легче вам будет разрабатывать сложные действия на основе входных данных, которые вам нужно проанализировать.
Важными вещами являются распознавание отдельных действий, понимание того, когда sed переходит на следующую строку, и прогнозирование того, что может содержать шаблон и пространство хранения.
Скачать шпаргалку
Сед сложный. Он имеет всего дюжину команд, но его гибкий синтаксис и мощные возможности означают, что он полон безграничного потенциала. Раньше я ссылался на страницы с умными остротами, пытаясь получить максимальную пользу от sed, но только когда я начал изобретать (а иногда и изобретать заново) свои собственные решения, я почувствовал, что начинаю на самом деле выучите sed. Если вам нужны мягкие напоминания о командах и полезные советы по синтаксису, скачайте нашу шпаргалку по sed и начните изучать sed раз и навсегда!