LINUX.ORG.RU

добавить «ключ = значение» в определенный раздел конфига

 ,


0

1

как организовать добавление строк в определенный раздел конфигурационного файла?

Есть конфиг на условно 5 машинах, вида:

# конфиг
[раздел-1]
xxx=1
yyy=2
[раздел-2]
xxx=2
zzz=7
#sss="зарплате-толстый-кошель"
[раздел-3]
xxx=4
sss="миру-мир"

необходимо добавить/заменить в [раздел-2] несколько новых значений (если их там нет) fff=«10» zzz=«5»

Собственно вопрос, есть ли какие-нибудь наработки по sed/awk для осуществления такого рода правки, чтоб не глобально менять а только в определенном разделе, который может быть в любой части конф.файла? И ключ в разделе уже такой есть, но он имеет знчение отличного от нужного. Может есть какие-нибудь другие инструменты для этого дела?



Последнее исправление: karasic (всего исправлений: 1)

Возьми Python и iniparse, или возьми Perl и Config::Simple.

r3lgar ★★★★★
()
use Config::Tiny;

my $config = Config::Tiny->new();
$config = Config::Tiny->read('config.ini', 'utf8');
$config->{'раздел-2'}->{'fff'} = 10;
$config->{'раздел-2'}->{'zzz'} = 5;
$config->write('config.ini', 'utf8');
shell-script ★★★★★
()

Если хочется именно awk, предлагаю такой вариант:

awk -F= -vsect=раздел-2 -vkey=fff -vvalue=10 'mysect && $1 == key { next } { print } match($0, /^\[([^\]]+)\]$/, m) && 
(mysect = (m[1] == sect)) { print key "=" value }

unterwulf
()

на условно 5 машинах

ansible <host-pattern> -m ini_file  -a 'path="/my/remote/config.ini" section="раздел-2" option="fff" value="«10»"'
anonymous
()
Ответ на: комментарий от shell-script

$config->write('config.ini', 'utf8');

А это точно гарантирует, что всё остальное (что не редактировалось) не поломается (порядок строк, комментарии, пустые строки, пробелы)?

monk ★★★★★
()
Ответ на: комментарий от monk

Внутри секции отсортирует в алфавитном порядке по key. А разве формат ini предусматривает строгую очередность параметров внутри секции?

Что касается пробелов и пустых строк в дефолте write приведёт конфиг к такому виду:

[section1]
xxx=foo
yyy=bar baz

[section2]
zzz=foobar

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

shell-script ★★★★★
()
Последнее исправление: shell-script (всего исправлений: 1)
Ответ на: комментарий от monk

Этот вариант попробовал первым на perl+Config::Tiny Действительно, он с «нюансами»: комментарии и пустые строки удаляет, остаются только действующие ключ=значение, к тому же у меня был «конфиг» в котором строки-значения переносились на другую строку со слешем в конце первой строки, и пока такие строки не поправишь, программка не отрабатывала с не информативным сообщением об ошибке. На этом фоне вариант с ansible оказался наиболее предпочтительным, с учетом того что он развернут и я им пользуюсь понемногу, правда освоил малую часть возможностей, теперь ещё одну вот в копилку занесу :-)

Те нюансами которые были в perl+Config::Tiny - ansible решает, в исходный конфиг вносится/правится только то что нужно, комменты и пробелы остаются не тронутыми.

karasic
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.