Поиск по сайту:

Научитесь использовать текстовый редактор 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 могу сделать для тебя.

Статьи по данной тематике: