![Инструмент для замены блока в файле](https://rvso.com/image/97243/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B4%D0%BB%D1%8F%20%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D1%8B%20%D0%B1%D0%BB%D0%BE%D0%BA%D0%B0%20%D0%B2%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B5.png)
Большинство программных инструментов управления конфигурацией позволяют заменить блок в файле.
Пример:
- СольСтек:блокироватьзаменить
- Ансибль:blockinfile
Мне нужно именно это, но без накладных расходов на эти громоздкие инструменты.
Существует ли простой инструмент для обновления и сохранения блока в текстовом файле?
Пример: Я хочу обновить/etc/some-server/some-server.conf
Я хочу вставить/обновить такой блок:
## start my-block
key1=value1
key2=value2
## end my-block
Я знаю, что это можно сделать с помощью нескольких строк awk или python, но я ищу готовый к использованию инструмент.
решение1
Sed хорош для замены текста. У меня нет оболочки bash, чтобы проверить это, но грубо говоря, команда, которая вам нужна/есть в наличии, учитывая мои ограниченные знания о вашей проблеме, это
sed '/in lines containing this/cut this/paste this/' in.file >out.file
Он также принимает формат замены 's/this/that/' и идеально подходит для серии переданных по конвейеру команд.
решение2
Насколько это просто, зависит от того, как инструмент должен вести себя в неноминальных условиях. Если в файле всегда есть только один блок со специальными комментариями, то это достаточно просто с awk, например.
awk '
/^## end my-block$/ {skip=0}
!skip {print}
/^## start my-block$/ {skip=1; system("cat new-block-content") || exit(1)}
' </etc/some-server/some-server.conf >/etc/some-server/some-server.conf.new &&
mv /etc/some-server/some-server.conf.new /etc/some-server/some-server.conf
Если вы хотите добавить блок в конец, если его еще нет, это все равно не так уж и сложно:
awk '
/^## end my-block$/ {skip=0}
!skip {print}
/^## start my-block$/ {skip=1; system("cat new-block-content") || exit(1)}
END {print "## start my-block"; system("cat new-block-content") || exit(1); print "## end my-block"}
' </etc/some-server/some-server.conf >/etc/some-server/some-server.conf.new &&
mv /etc/some-server/some-server.conf.new /etc/some-server/some-server.conf
Справляться с другими сценариями (например, начальный комментарий присутствует, но не конечный, несколько блоков и т. д.) становится все сложнее.