Команда «Sed» в Linux: пояснения полезных приложений

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

Мы писали о POSIX и рассмотрели некоторые интерфейсы и утилиты, которые система должна предоставлять для соответствия POSIX. Инструмент командной строки сед является одной из тех утилит, которые предоставляют богатый возможностями способ фильтрации, поиска, замены и перестановки данных в текстовых файлах. Это чрезвычайно мощный инструмент, с которым очень легко начать работать, но очень сложно изучить его вдоль и поперек из-за его, казалось бы, бесконечного количества функций.

Во-первых, следует отметить, что реализация GNU седхотя и соответствует POSIX, выходит за рамки спецификации, предоставляя расширения и функции, не описанные в требовании POSIX. При вызове сед вы захотите использовать –позикс флаг, чтобы отключить все расширения, специфичные для GNU, и обеспечить большую переносимость. Это ключевой момент при написании скриптов, которые вы собираетесь запускать на различных платформах. Например, набор инструментов, предоставляемых с macOS, не будет инструментами GNU, как и те, которые обычно встречаются в *BSD.

Как использовать сед команда в Linux?

Общий синтаксис следующий:

сед [OPTION]… {скрипт-только-если-нет-другого-скрипта} [input-file]…

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

Существует несколько различных режимов, которые сед могут работать в, некоторые могут быть объединены. Те, которые мы рассмотрим, являются основами, но они все еще очень мощные и становятся еще более мощными, когда вы расширяете свои знания сед и регулярные выражения.

  • p – Печать – печатает строки с соответствующим текстом
  • d – Удалить – удаляет строки с совпадающим текстом
  • s – Substitute – заменяет или подставляет соответствующий текст в каждой строке

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

Читайте также: Команда «Cut» в Linux: пояснения полезных приложений

Некоторый сед флаги команд (в отличие от флагов шаблонов) мы будем использовать следующие –

  • n – подавляет автоматическую печать текста, который не соответствует
  • E/r – включает расширенные регулярные выражения
  • i – редактирует файл на месте, а не выводит на экран

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

Здесь мы можем указать диапазон строк для печати –

sed -n '2,10p' мой_файл.txt

Мы указали строки со 2 по 10, которые должны быть напечатаны. Синтаксис в сед странно, но это эффективно. Мы используем установите здесь флажок, чтобы убедиться, что печатаются только эти совпадения, в противном случае будут напечатаны все строки, а совпадающие будут продублированы.

ПРИМЕЧАНИЕ: В седстроки начинаются с 1, а не с 0.

И наоборот, мы можем удалить те же строки.

sed '2,10d' мойфайл.txt

Поскольку мы не отображаем только те, которые соответствуют, мы хотим удалить наши флаг, чтобы наши строки печатались.

Эти примеры очень надуманы, поэтому трудно понять, как они могут быть полезны, но мы к этому доберемся.

Далее мы можем начать подставлять вхождения определенного шаблона в строку. Это особенно полезно для системных администраторов. Всякий раз, когда я устанавливаю Linux на новую машину, я хочу включить sshd, но я хочу убедиться, что пользователь root не сможет войти в систему.

sed -i 's/[#]PermitRootLogin да/PermitRootLogin нет/g' /etc/ssh/sshd_config

Эта команда выполнит поиск по /etc/ssh/sshd_config для строки, содержащей #PermitRootLogin да (с # или без него) и измените его на PermitRootLogin нет на месте. Скобки позволяют использовать необязательное соответствие, что очень мощно. Различные дистрибутивы поставляются с разными значениями по умолчанию в конфигурациях, так что это очень удобно.

ПРИМЕЧАНИЕ: Будьте очень осторожны при использовании флаг, так как вы можете легко потерять работу или разрушить конфигурацию системы.

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

sed '2,10{s/hello/Hello/;}' myfile.txt

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

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

Читайте также: Полный список команд Linux от А до Я | Справочник командной строки Linux

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *