Научитесь использовать текстовый редактор Sed
В Sed отсутствуют обычные текстовые поля, и вместо этого он записывает непосредственно в файл по указанию пользовательских команд.
Команда sed
, созданная для версии 7 исходной операционной системы Unix компании AT&T, с тех пор включена, пожалуй, во все ОС Unix и Linux. Приложение sed
представляет собой потоковый редактор и, в отличие от текстового редактора, не открывает визуальный буфер, в который загружаются данные файла для обработки. Вместо этого он работает с файлом, строка за строкой, в соответствии либо с командой, введенной в терминал, либо с серией команд в сценарии.
Установка
Если вы используете Linux, BSD или macOS, значит, у вас уже установлен GNU или BSD sed
. Это две уникальные реализации исходной команды sed
, и хотя они похожи, между ними могут быть незначительные различия. GNU sed
обычно считается наиболее многофункциональным из существующих sed
, и он широко доступен на любой из этих платформ.
Если вы не можете найти GNU sed
(часто называемый gsed
в системах, отличных от Linux), вы можете загрузить его исходный код с веб-сайта GNU. Преимущество установки GNU sed
заключается в том, что его можно использовать для дополнительных функций, но его также можно ограничить так, чтобы он соответствовал только POSIX спецификациям sed
, если вам нужна портативность.
В Windows вы можете установить GNU sed
с Chocolatey.
Как работает Сед
Приложение sed
работает с одной строкой за раз. Поскольку у него нет визуального отображения, он создает пространство шаблонов — пространство в памяти, содержащее текущую строку из входного потока (с удалением любого завершающего символа новой строки). Как только пространство шаблонов будет заполнено, ваши инструкции для sed
будут выполнены. Иногда ваши команды являются условными, а иногда — абсолютными, поэтому результаты этих команд зависят от того, как вы используете sed
.
Когда достигается конец команд, sed
печатает содержимое пространства шаблонов в выходной поток. Поток вывода по умолчанию — stdout, но его можно перенаправить в файл или даже обратно в тот же файл с помощью параметра --in-place=.bak
.
Затем цикл начинается снова со следующей входной строки.
Синтаксис команды sed
:
$ sed --options [optional SCRIPT] [INPUT FILE or STREAM]
Найдите то, что хотите отредактировать
В визуальном редакторе вы обычно находите в текстовом файле то, что хотите изменить, не задумываясь об этом. Ваш глаз (или программа чтения с экрана) сканирует текст, находит слово, которое вы хотите изменить, или место, где вы хотите вставить или удалить текст, а затем вы просто начинаете печатать. Однако для sed
нет интерактивного режима, поэтому вы должны указать ему, какие условия должны быть выполнены, чтобы он мог выполнять определенные команды.
В этих примерах предположим, что файл с именем example.txt
содержит следующий текст:
hello
world
This is line three.
Here is the final line.
Номер строки
Указание номера строки указывает sed
работать только с этой конкретной строкой в файле.
Например, эта команда выбирает строку 1 файла и печатает ее. Поскольку действием по умолчанию sed
после обработки также является вывод строки в stdout, это приводит к дублированию первой строки:
$ sed ‘1p’ example.txt
hello
hello
world
This is line three.
Here is the final line.
Вы также можете указать номера строк по шагам. Например, 1~2
означает, что выбраны каждые две строки («выберите каждую вторую строку, начиная с первой»). Инструкция 1~3
означает выбор каждой третьей строки после первой:
$ sed ‘1p’ example.txt
hello
hello
world
This is line three.
Here is the final line.
Here is the final line.
Положение линии
Вы можете работать только с последней строкой файла, используя $
в качестве селектора:
$ sed ‘$p’ example.txt
hello
world
This is line three.
Here is the final line.
Here is the final line.
В GNU sed
вы можете выбрать более одной строки (например, sed '1,$p'
выводит первую и последнюю строку).
Отрицание
Любой выбор по номеру или позиции можно инвертировать с помощью символа восклицательного знака (!
). При этом будут выбраны все строки кроме первой строки:
$ sed ‘1!p’ example.txt
hello
world
world
This is line three.
This is line three.
Here is the final line.
Here is the final line.
Сопоставление с образцом
Сопоставление с шаблоном можно рассматривать как операцию поиска в текстовом процессоре или браузере. Вы указываете слово (шаблон), и результаты выбираются. Синтаксис сопоставления с шаблоном: /pattern/
.
$ sed ‘/hello/p’ example.txt
hello
hello
world
This is line three.
Here is the final line.
$ sed ‘/line/p’ example.txt
hello
world
This is line three.
This is line three.
Here is the final line.
Here is the final line.
Редактирование с помощью Sed
Найдя то, что хотите отредактировать, вы можете выполнить любое действие, которое захотите. Вы выполняете редактирование с помощью sed
с помощью команд. Команды в sed
отличаются от самой команды sed
. Если это поможет, думайте о них как о «действиях», «глаголах» или «инструкциях».
Команды в sed
состоят из отдельных букв, например p
для print команды, использованной в предыдущих примерах. Поначалу их может быть трудно вспомнить, но, как и во всем, вы узнаете их на практике.
р для печати
Инструкция p
выводит все, что в данный момент содержится в пространстве шаблонов.
д для удаления
Инструкция d
удаляет пространство шаблонов.
$ sed ‘$d’ example.txt
hello
world
This is line three.
$ sed ‘1d’ example.txt
world
This is line three.
Here is the final line.
s для поиска и замены
Команда s
ищет шаблон и заменяет его чем-то другим. Вероятно, это наиболее популярное и случайное использование sed
, и часто это первая (а иногда и единственная) команда sed
, которую изучает пользователь. Это почти наверняка самая полезная команда для редактирования текста.
$ sed ‘s/world/opensource.com/’
hello
opensource.com
This is line three.
Here is the final line.
Существуют также специальные функции, которые вы можете использовать в замещающем тексте. Например, \L
преобразует текст замены в нижний регистр, а \l
делает то же самое только для следующего символа. Есть и другие, которые перечислены в документации sed
(вы можете просмотреть их с помощью команды info sed
).
Специальный символ &
в предложении замены относится к совпавшему шаблону:
$ sed ‘s/is/\U&/’ example.txt
hello
world
ThIS is line three.
Here IS the final line.
Вы также можете передать специальные флаги, чтобы повлиять на то, как s
обрабатывает найденные данные. Флаг g
(предположительно для global) указывает s
применить замену ко всем совпадениям, найденным в строке, а не только к первому совпадению:
$ sed ‘s/is/\U&/g’ example.txt
hello
world
ThIS IS line three.
Here IS the final line.
Другие важные флаги включают число, указывающее, на какое вхождение совпадающего шаблона следует повлиять:
$ sed ‘s/is/\U&/2’ example.txt
hello
world
This IS line three.
Here is the final line.
Флаг w
, за которым следует имя файла, записывает совпадающую строку в файл только если внесено изменение:
$ sed ‘s/is/\U&/w sed.log’ example.txt
hello
world
ThIS is line three.
Here IS the final line.
$ cat sed.log
ThIS is line three.
Here IS the final line.
Флаги можно комбинировать:
$ sed ‘s/is/\U&/2w sed.log’ example.txt
hello
world
This IS line three.
Here is the final line.
$ cat sed.log
This IS line three.
Скрипты
Существует множество отличных сайтов с sed
«однострочниками». Они предоставляют вам ориентированные на задачи команды sed
для решения распространенных проблем. Однако самостоятельное изучение sed
позволит вам писать свои собственные однострочники, которые можно будет адаптировать к вашим конкретным потребностям.
Сценарии для sed
можно писать в виде строк в терминале или сохранять в файл и выполнять с помощью самого sed
. Я склонен писать небольшие сценарии как одну команду, потому что редко повторно использую команды sed
в реальной жизни. Когда я пишу сценарий sed
, он обычно очень специфичен для одного файла. Например, после написания первоначального варианта этой самой статьи я использовал sed
, чтобы стандартизировать написание слова «sed» с заглавной буквы, и эту задачу мне, вероятно, больше никогда не придется выполнять.
Вы можете выполнить серию отдельных команд для sed
, разделенных точкой с запятой (;
).
$ sed ‘3t ; s/line/\U&/’ example.txt
hello
world
This is LINE three.
This is the final line.
Изменение области видимости с помощью фигурных скобок
Вы также можете ограничить результаты, на которые это влияет, с помощью фигурных скобок ({}
). Когда вы заключаете команды sed
в фигурные скобки, они применяются только к определенному выбору. Например, слово «строка» встречается в двух строках образца текста. Вы можете заставить sed
влиять только на последнюю строку, объявив необходимое условие соответствия ($
для обозначения последней строки) и введя команду s
вы хотите, чтобы сразу после этого выполнялись в фигурных скобках:
$ sed ‘$ {s/line/\U&/}’ example.txt
hello
world
This is line three.
This is the final LINE.
Изучите Сед
С помощью sed
вы можете сделать гораздо больше, чем описано в этой статье. Я даже не дошел до ветвления (b
), тестов (t
), пространства hold (H
) ) и многие другие функции. Как и ed
, sed
, вероятно, не тот текстовый редактор, который вы собираетесь использовать для создания документов или даже для каждой скриптовой задачи, которую вам нужно выполнить, но это мощный вариант. вы являетесь пользователем POSIX. Изучение того, как структурированы команды sed
и как писать короткие сценарии, поможет быстро вносить изменения в большие объемы текста. Прочтите страницы info
GNU sed
или страницы руководства BSD sed
и узнайте, что такое sed
могу сделать для тебя.