Инструмент для замены блока в файле

Инструмент для замены блока в файле

Большинство программных инструментов управления конфигурацией позволяют заменить блок в файле.

Пример:

Мне нужно именно это, но без накладных расходов на эти громоздкие инструменты.

Существует ли простой инструмент для обновления и сохранения блока в текстовом файле?

Пример: Я хочу обновить/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

Справляться с другими сценариями (например, начальный комментарий присутствует, но не конечный, несколько блоков и т. д.) становится все сложнее.

Связанный контент