Это может быть лучше сделано с помощью awk
, в котором вы можете использовать машинный метод состояния -:
awk '/^reader_1 = newcamd\({/ { section_found = 1} /})/ { section_found = 0 } section_found && /port = 27020,$/ { sub(/27020,$/, "22443,") } { print }' file1 > file2 && mv file2 file1
Пояснение:
Установить флаг при обнаружении начала раздела:
/^reader_1 = newcamd\({/ {
section_found = 1
}
Очистить флаг при обнаружении конца раздела:
/})/ {
section_found = 0
}
Подставить новый номер порта в правой части и в правой строке:
section_found && /port = 27020,$/ {
sub(/27020,$/, "22443,")
}
Печать всех строк:
{
print
}
Отправить вывод в файл2 (временный файл):
> file2
Если все прошло успешно, переименуйте файл2 в файл1:
&& mv file2 file1
Вы можете сделать регулярные выражения настолько свободными или жесткими, насколько вам нужно.
Этот тип кода легче читать и поддерживать, чем код sed
или ed
, особенно если вы отформатируете его так же, как в моем объяснении.
Это связано с ошибкой в Ansible, которая появилась при переходе на FQCN:https://github.com/ansible/ansible/pull/71824
В качестве временного решения вы можете просто заменить ansible.builtin.shell
старым именем -школы shell
.