Иногда
sed слишком грубый инструмент: нужны условия, состояние, счетчики. В таких случаях проще пройтись по файлу построчно и собрать новый контент вручную.▪️ Задача
Заменить блок между маркерами
# BEGIN и # END, не трогая остальной файл.▪️ Идея
читаем файл построчно;
отслеживаем, где мы находимся;
пишем результат во временный буфер;
атомарно подменяем файл;
🛠 Реализация
in_block=0
tmp=$(mktemp)
while IFS= read -r line; do
case "$line" in
"# BEGIN"*)
in_block=1
echo "$line" >>"$tmp"
echo "new content line 1" >>"$tmp"
echo "new content line 2" >>"$tmp"
;;
"# END"*)
in_block=0
echo "$line" >>"$tmp"
;;
*)
(( in_block )) || echo "$line" >>"$tmp"
;;
esac
done < config.conf
mv "$tmp" config.conf
▪️ Что здесь важно
IFS= read -r - сохраняет пробелы и \mktemp - безопасный временный файлmv - атомарная замена (без битых конфигов)BashTex 📱 #bash #utils