Что такое команда sed в Linux?

Многие пользователи Linux и многочисленных дистрибутивов Linux время от времени или регулярно работают на уровне командной строки. Некоторые задачи могут быть выполнены быстрее или лучше в терминале, чем в графическом интерфейсе пользователя. Для этого, однако, необходимо знать различные команды и то, как они работают. Одной из таких команд в Linux является «sed».

Хотя редактор потоков (sed) является текстовым редактором, это не то, о чем вы можете подумать в отношении такого рода программ. В Linux, SED — это команда, которая может использоваться для чтения и корректировки потоков данных. Поэтому инструмент в основном используется в программировании оболочки. Но как это работает?

Когда вы используете SED в Linux?

Команда «sed» входит в базовую комплектацию каждой установки Linux, поскольку она относится к GNU Core Utilities (coreutils). Этот инструмент называют неинтерактивным текстовым редактором. Это означает, что вы не вносите изменения непосредственно в редактируемый файл. Вместо этого вы сначала создаете временный файл, содержимое которого затем передается в исходный файл. Linux SED работает построчно. Каждая строка файла читается отдельно, обрабатывается, а затем выводится снова. Наиболее важной функцией SED является поиск определенных строк в файле и последующая замена их другими символами.

Таким образом, вы можете кардинально изменить весь файл — почти автоматически — с помощью всего одной команды. Если интегрировать такие команды в сценарий оболочки, можно значительно упростить выполнение повторяющихся задач. Например, таким образом можно поддерживать базы данных или обширный исходный код. Вместо того чтобы корректировать каждую запись вручную, вы можете просмотреть весь файл за один раз с помощью SED.

Синтаксис и функции команды SED

Команда SED работает с командами и применяется к файлам. Как сама команда, так и команды могут быть расширены опциями.

sed [Option(s)] 'Command(s)' [File(s)]

Вы можете либо вводить команды непосредственно в команде, либо считывать их из файла. В последнем случае вместо команды вы вводите путь к файлу.

Опции

Как это типично для команд Linux, SED также дает вам возможность определить параметры. Они особенно важны для команды SED, поскольку только с их помощью становится ясно, как будет интерпретироваться последующая команда. Возможны следующие параметры:

Опция

Объяснение

-e

Указывает, что используется один или несколько скриптов SED.

-f

Указывает, что сценарий берется из файла.

-n

Результаты не выводятся.

-i

Создает более временный файл, который впоследствии заменяет исходный файл.

-u

Буфер данных не используется.

-s

Несколько файлов обрабатываются отдельно, а не как один длинный поток данных.

-r

Команда принимает расширенные регулярные выражения.

Опции -e и -f являются наиболее важными. Они указывают, находится ли команда непосредственно в команде (тогда это сценарий SED) или команда должна обращаться к дополнительному файлу. Часто можно обойтись без опции -e, поскольку она используется по умолчанию. Однако, как только вы включаете в команду более одной команды одновременно, включение опции обязательно.

Примечание .

Если вы используете опцию -e, параметр должен быть записан непосредственно перед первой командой. Если вы используете другие параметры, запишите их перед первой командой. Если вы включаете в команду другие команды, поместите параметр и перед ними.

Очень важным — и, возможно, незаменимым для вашей работы — является параметр -n. Если параметр не установлен, в терминале отображается каждая строка прочитанного текстового файла, что не очень удобно, особенно при работе с большими базами данных. Если вы активируете параметр, то отображаются только те строки, которые также затронуты командой.

Команды

Команда определяет действия, которые она должна выполнить с исходным файлом и с учетом указанных опций.

Команда

Описание

a

append: Добавляет одну или несколько других строк к выбранным строкам.

c

изменить: Заменяет выделенные строки новым содержимым.

d

удалить: Удаляет выбранные строки.

g

get: Копирует содержимое из пространства hold в пространство patten.

G

GetNewline: Вставляет содержимое из пространства удержания в пространство паттерна.

h

hold: Копирует содержимое из пространства шаблона в пространство удержания.

H

HoldNewLine: Вставляет содержимое из пространства детали в пространство удержания.

i

Вставить: вставляет одну или несколько строк перед выбранными строками.

l

листинг: Отображает все непечатаемые знаки.

n

next: Переключает на следующую команду в команде для следующей строки.

p

печать: Выводит на экран выбранные строки.

q

quit: Завершает работу Linux SED.

r

read: Читает выбранные строки вслух из файла.

s

заменить: Заменяет указанный источник другим.

x

xchange: Меняет местами место детали и место удержания.

y

yank: Заменяет один указанный символ другим.

w

писать: Записывает строки в текстовый файл.

!

Отрицание: Применяет команду к строкам, которые не относятся к введенным.

Факт

Два типа памяти — пространство удержания и пространство паттернов — имеют разные задачи: Пространство паттернов описывает кратковременную рабочую память. Оно содержит данные, с которыми команда работает в данный момент. Пространство hold является более долгосрочным. Данные, находящиеся в нем, могут быть извлечены, даже если SED уже занят чем-то другим.

Команды также могут быть расширены с помощью опций:

Опция

Описание

=

Указывает номер строки выбранных строк.

p

Выводит измененные строки.

g

Применяет команду ко всему файлу.

Факт

Команды всегда следует начинать и заканчивать одинарными кавычками. Таким образом, вы избежите необходимости переосмысления вводимых данных. В принципе, эти символы не обязательны, но таким образом вы избежите многих источников ошибок.

Регулярные выражения

При использовании SED важно иметь представление о регулярных выражениях. Символы используются для того, чтобы указать команде, как обрабатывать последовательность символов. Например, важны квадратные и круглые скобки:

  • [ABC]: Класс символов используется при поиске совпадения из группы букв, цифр или символов, т.е. либо A, либо B, либо C.
  • (ABC): Группа символов описывает фиксированный термин; т.е. ABC в данном порядке.

Подстановочные знаки позволяют регулярным выражениям также искать только части терминов. Вы можете использовать два различных варианта:

  • .: Полная остановка заменяет ровно один символ.
  • *: Звездочка заменяет любое количество символов.

Кроме того, регулярные выражения дают возможность более точно определить частоту встречаемости символов (-сочетаний).

  • ?: Вопросительный знак указывает на то, что термин может встречаться один раз или не встречаться вообще.
  • +: Знак плюс указывает, что символ встречается более одного раза, но не менее одного раза.
  • {0,n}: С помощью числа в фигурных скобках вы указываете, как часто может встречаться данная комбинация символов. Если вы вводите два значения (разделенные запятой), вы определяете минимальное и максимальное количество повторений.

Наконец, при работе с Linux и SED вы также можете включать логические символы, которые помогают вам, например, при связывании или вложении поисковых запросов.

  • |: Труба стоит между двумя терминами и символизирует их альтернативу.
  • ^: Циркумфлекс (пишется непосредственно перед термином) отрицает его; поэтому эта строка не должна встречаться.

Итак, с помощью этих символов вы изменяете ввод в команде SED и таким образом можете выполнять сложные задачи.

Адреса

В Linux SED входы называются адресами. Адрес, таким образом, является целью команды. Вы можете указать его различными способами. Во многих ситуациях вы будете вводить поисковые запросы, украшенные регулярными выражениями. Но можно также, например, выделить строки текстового файла напрямую. Соответственно, вы по-разному записываете адреса.

В первом примере вы ссылаетесь на конкретные строки:

sed -n '10,50p' text.txt

С помощью этого кода вы бы вывели в терминал строки с 10 по 50.

Если вы не знаете, в каких именно строках содержится информация, с которой вы хотите работать, вы можете поискать адрес. Здесь важно, чтобы выражения всегда начинались и заканчивались косой чертой. Таким образом, вы отделяете фактический поисковый запрос от другой информации, например, команд.

sed -n 'example.[1-9]/p' text.txt

Этот код выдаст вам все строки, помеченные как example или examples, за которыми следует цифра.

Объяснение SED на трех примерах

Команда Linux SED может оказать быструю помощь в самых разных ситуациях. Особенно когда вам нужно внести сразу много изменений в обширные текстовые файлы, этот инструмент показывает свои сильные стороны. В следующих трех примерах мы покажем вам различные способы использования SED в повседневной жизни Linux.

Поиск в текстовом файле

Самое простое использование команды SED — это поиск определенных данных в документе. Это может пригодиться, например, в обширных базах данных или в исходном коде. Таким образом, вы можете быстро найти содержимое, которое вы хотите либо только прочитать, либо еще и изменить.

Предположим, например, что вы ищете «Шардоне» в своем обширном винном погребе. Кроме того, вы хотели бы отобразить первую строку базы данных, в которой объясняются отдельные столбцы. Следующая команда поможет вам найти расположение бутылок:

sed -n -e '1p' -e '/Chardonnay/p' wine.txt

Здесь вы используете две команды подряд. Обе они вводятся через -e. Результат выглядит следующим образом:

Shelf Growing area Grape variety Year
1 Pfalz Chardonnay 2001
2 Mosel Chardonnay 1983
3 Alsace Chardonnay 1981

Если вы хотите отображать только 1980-е годы, это также возможно с небольшими изменениями в коде.

sed -n -e '1p' -e '/Chardonnay * 198./p' wine.txt
Shelf Growing area Grape variety Year
2 Mosel Chardonnay 1983
3 Alsace Chardonnay 1981

Подстановочный знак между сортом винограда и винтажом в принципе не важен в этом примере. Однако, если база данных неверна или вы вставите колонку позже, информация останется верной.

Добавление информации

С помощью Linux и команды SED вы также можете расширять базы данных. Так, чтобы внести новые записи, вам не нужно открывать файл в полнотекстовом редакторе, изменять его и сохранять. Вместо этого вы можете внести изменения с помощью всего одной строки кода.

Для нашего примера предположим, что вы получили две новые бутылки вина для своей коллекции. Понятно, что вы также хотели бы ввести их в свою базу данных. Для этого вы можете просто добавить новую строку в конец текстового файла с помощью SED.

sed -i -e '$a2 Mosel Dornfelder 2010' -e '$a4 Alsace Pinot Grigio 2011' wine.txt

Регулярное выражение $ заставляет SED сначала перейти к последней строке. Команда a вызывает добавление новой строки с содержимым, которое в конечном итоге следует за ней. Мы используем опцию -i, чтобы убедиться, что исходный файл модифицируется напрямую. В качестве альтернативы вы можете создать новую базу данных:

sed -e '$a2 Mosel Dornfelder 2010' -e '$a4 Alsace Pinot Grigio 2011' wine.txt > wine1.txt

Ведение баз данных

Если вы хотите изменить структуру больших баз данных с большим количеством записей в ретроспективе, то вручную это практически невозможно. Однако Linux предлагает быстрое решение с помощью SED. До сих пор отдельные столбцы в вашем файле были разделены пробелом. Предположим, что в данном примере вы хотите заменить пробел на дефис. Для этого мы используем команду s:

sed -i -e 's/[[:space:]]/-/g' wine.txt

g в конце адреса гарантирует, что команда будет применена ко всему файлу.

Аналогичная проблема возникает, если вы хотите добавить дополнительную информацию в строку. Например, предположим, что в будущем вы также захотите отметить, пробовали ли вы уже данное вино или нет. Перед тем, как добавлять в ассортимент неизвестные вина, сначала отметьте все вина как уже продегустированные.

sed -i -e 's/$/-known/g' wine.txt

Теперь маркер вставляется во все строки — включая первую строку, в которой вы присваиваете имена столбцам. Чтобы изменить это, сделайте еще одну подстановку в первой строке.

sed -i -e '1s/known/tasted/' wein.txt

Альтернативы SED

Linux SED — это мощная команда, с помощью которой можно выполнять множество различных задач. Однако некоторые вещи могут быть решены только очень неудобным способом и с помощью нескольких хитростей. С помощью аналогичных команд вы, возможно, сможете достичь цели быстрее и безопаснее.

AWK

AWK зарекомендовал себя как дальнейшее развитие SED. С помощью этой команды вы также работаете с регулярными выражениями, но у вас есть дополнительные возможности, с которыми вы можете быть знакомы по более сложным языкам программирования. Это означает, что с помощью AWK вы можете составлять команды, содержащие операторы if-else или циклы while-do.

PERL

Хотя AWK в основном ориентирован на языки C, в нем также есть команда, работающая на основе PERL. Хотя с помощью этого языка можно создавать сложные системы, PERL также подходит для небольших задач в терминале или в сценариях Bash.

TR

Если вы хотите преобразовать отдельные символы в текстовом файле, это может быть проще сделать с помощью команды, отличной от SED. TR (сокращение от: translate) предназначена для замены букв, цифр или специальных символов на другие. Например, вы можете быстро удалить дублирующиеся пробелы или скорректировать регистр. Хотя такие небольшие задачи очень легко выполнить с помощью TR, для более сложной работы пригодятся другие решения, такие как SED.

Оцените статью
cdelat.ru
Добавить комментарий