Sed эта мощная утилита, которая позволяет обрабатывать текст, здесь же описано изменение строки в конфиге с помощью sed.
Введение
Когда требуется поправить какой-нибудь конфиг, мы можем сделать это с помощью какого-нибудь редактора, например nano. Но иногда хочется чтобы конфиг менялся по команде, например из скрипта, или из подготовленной инструкции. Это возможно сделать с помощью утилиты sed.
Утилита sed (Stream Editor) — это мощная утилита командной строки в Linux для обработки текстовых данных. Она позволяет производить фильтрацию, поиск, замену, вставку и удаление строк или частей текста в файлах или потоках данных.
Вот несколько примеров работы этой утилиты.
- Редактирование строк с помощью регулярных выражений, но без редактирования самого файла. Замена производится с помощью команды
s
, мы говорим что и на что меняем.
# sed 's/old/new/' file.txt
- Предыдущая команда не редактирует файл. Внесение изменений непосредственно в файл производится с помощью опции
-i
. Пример:
# sed -i 's/old/new/' file.txt
- Поиск и удаление определённых строк, подпадающих под шаблон (pattern) выполняется с помощью команды
d
. Пример:
# sed '/pattern/d' file.txt
- Добавление строки после строки, попадающей под шаблон (pattern) выполняется с помощью команды
a
. Пример:
# sed '/pattern/a\New line' file.txt
- Также есть возможность выполнять несколько команд через опцию
-e
. Например заменим строки (s
) и удалим строки (d
):
sed -e 's/foo/bar/' -e '/baz/d' file.txt
Нашей задачей будет поиск и изменение строки в конфиге, то есть значения определённого параметра, с помощью утилиты sed. Делается это примерно так:
# sed -i '/pattern/s/old/new/' example.conf
То есть мы редактируем файл (используем опцию -i
). Находим строку по pattern и в строке меняем (команда s
) old на new. И вместо строк мы можем использовать регулярные выражения.
Практика
Для начала придумаем тестовый конфиг, например такой:
$ cat <<EOT > example.conf parameter_1 = 10 parameter_2 = 13 parameter_3 = 133 parameter_4 = 58 parameter_5 = 38 EOT
Теперь с помощью sed закомментируем parameter_3:
$ sed -i '/^parameter_3 =/s/^/# /' example.conf $ cat example.conf parameter_1 = 10 parameter_2 = 13 # parameter_3 = 133 parameter_4 = 58 parameter_5 = 38
А чтобы снять комментарий, сделаем так:
$ sed -i '/^# parameter_3 =/s/^# //' example.conf $ cat example.conf parameter_1 = 10 parameter_2 = 13 parameter_3 = 133 parameter_4 = 58 parameter_5 = 38
А если мы не знаем, закомментирована строка или нет, а нам нужно в любом случае снять комментарий и выставить значение. Это тоже можно сделать. Для начала вернём комментарий, а затем выполним замену.
$ sed -i '/^parameter_3 =/s/^/# /' example.conf $ cat example.conf parameter_1 = 10 parameter_2 = 13 # parameter_3 = 133 parameter_4 = 58 parameter_5 = 38 $ sed -i '/^#\? parameter_3/s/.*/parameter_3 = 199/' example.conf $ cat example.conf parameter_1 = 10 parameter_2 = 13 parameter_3 = 199 parameter_4 = 58 parameter_5 = 38
В регулярном выражении ^#\?
означает что символ решётки не обязателен.
Другие статьи по программированию на bash вы найдёте здесь.
Если понравилась статья, подпишись на мой канал в VK.