Команда «Sed» в Linux: описание полезных приложений
Вам когда-нибудь приходилось очень быстро заменить текст в файле? Затем вам нужно открыть текстовый редактор, найти строку и ввести замену. Что делать, если вам придется делать это много раз? Что, если это не одно и то же, и вам придется выполнить несколько поисков и заменить каждое вхождение? Это очень быстро надоедает, но есть лучший способ сделать это с помощью инструмента под названием СЭД.
Мы написали о POSIX и рассмотрели некоторые интерфейсы и утилиты, которые система должна предоставлять, чтобы быть совместимой с POSIX. Инструмент командной строки СЭД — одна из тех утилит, которые предоставляют многофункциональный способ фильтрации, поиска, замены и изменения порядка данных в текстовых файлах. Это чрезвычайно мощный инструмент, с которым очень легко начать работу, но очень трудно изучить его до конца из-за, казалось бы, бесконечного количества функций.
Во-первых, следует отметить, что реализация GNU СЭДНесмотря на то, что он совместим с POSIX, он выходит за рамки спецификации и предоставляет расширения и функции, не описанные в требованиях POSIX. При вызове СЭД вы захотите использовать –posix флаг, чтобы отключить все расширения, специфичные для GNU, и обеспечить большую переносимость. Это ключевой момент при написании сценариев, которые вы собираетесь запускать на различных платформах. Например, набор инструментов, поставляемый с macOS, не будет соответствовать инструментам GNU, как и те, которые обычно присутствуют в *BSD.
Как использовать СЭД команда в Linux?
Общий синтаксис следующий
СЭД [OPTION]… {скрипт-только-если-нет-другого-скрипта} [input-file]…
Это немного загадочно, но по сути он ожидает, что за параметрами последует набор инструкций в текстовой форме, а затем файл для чтения. В случае, если вы передаете текст в Сед, вы можете опустить входной файл.
Есть несколько разных режимов, которые СЭД могут работать, некоторые можно комбинировать. Мы рассмотрим только основы, но они по-прежнему очень эффективны и становятся еще более важными по мере того, как вы развиваете свои знания в области СЭД и регулярные выражения.
- p – Печать – печатает строки с соответствующим текстом.
- d – Удалить – удаляет строки с совпадающим текстом.
- s – Substitute – заменяет или заменяет соответствующий текст в каждой строке.
Помимо режимов работы, существует множество флагов, которые можно использовать в конце текста шаблона, чтобы улучшить поведение вашей команды. Мы будем использовать г флаг, обозначающий глобальную замену, а не только замену первого вхождения в каждой строке, как по умолчанию.
Читайте также: Команда Cut в Linux: описание полезных приложений
Некоторый СЭД командные флаги (в отличие от флагов шаблонов) мы будем использовать следующие:
- n – подавляет автоматическую печать несовпадающего текста
- E/r – включает расширенные регулярные выражения.
- i – редактирует файл на месте, а не выводит на экран
Во-первых, нам нужно обсудить понятие адреса в СЭД. Адрес — это просто место в тексте. Если текст соответствует предоставленному шаблону, местом совпадения становится текущий адрес, в пределах которого выполняется команда. Также имеется поддержка диапазонов адресов в СЭД что позволяет указать часть файла для обработки, оставив остальную часть в покое.
Здесь мы можем указать диапазон строк для печати –
sed -n ‘2,10p’ myfile.txt
Мы указали строки со 2 по 10 для печати. Синтаксис в СЭД странно, но это эффективно. Мы используем -н установите здесь флажок, чтобы убедиться, что печатается только это совпадение, в противном случае будут напечатаны все строки, а те, которые соответствуют, будут продублированы.
ПРИМЕЧАНИЕ. В СЭДстроки начинаются с 1, а не с 0.
И наоборот, мы можем удалить те же строки.
sed ‘2,10d’ myfile.txt
Поскольку мы показываем не только те, которые совпадают, мы хотим удалить наши -н флаг, чтобы наши строки печатались.
Эти примеры очень надуманны, поэтому трудно понять, насколько это может быть полезно, но мы к этому доберемся.
Далее мы можем начать заменять вхождения определенного шаблона в строке. Это особенно полезно для системных администраторов. Всякий раз, когда я устанавливаю Linux на новую машину, я хочу включить sshd, но хочу убедиться, что пользователь root не может войти в систему.
sed -i ‘s/[#]PermitRootLogin да/PermitRootLogin нет/g’ /etc/ssh/sshd_config
Эта команда выполнит поиск /etc/ssh/sshd_config для строки, содержащей #PermitRootLogin да (с # или без него) и измените его на PermitRootЛогин нет на месте. Скобки допускают дополнительное сопоставление, что очень эффективно. Разные дистрибутивы поставляются с разными настройками по умолчанию, так что это очень удобно.
ПРИМЕЧАНИЕ. Будьте очень осторожны при использовании -я пометьте, так как вы можете легко потерять работу или разрушить конфигурацию системы.
Здесь мы можем объединить несколько различных функций в СЭД.
sed ‘2,10{s/hello/Hello/;}’ myfile.txt
Это несколько более продвинутый вариант. То, что мы здесь делаем, говорит СЭД чтобы запустить команду в строках со 2 по 10. То же самое можно сделать для печати или удаления всех строк с определенным соответствием шаблону.
В нем много функций СЭД и мы не сможем охватить их все. Если вам понравился этот урок, дайте нам знать, и мы обязательно сделаем еще. Покажите нам некоторые из ваших любимых СЭД команды в комментариях и не стесняйтесь запрашивать дополнительные руководства по командам.
Читайте также: Полный список команд Linux от А до Я | Справочник по командной строке Linux