Команда «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