LINUX.ORG.RU

Вставить многострочный текст после ключевого слова

 , , , ,


0

1

Нужно скриптом, на паре-восьмёрке серверов, добавить в конфиг Nginx, после определённого ключевого слова mykeyword, дополнительное описание формата логирования.
Примерный кусок, который нужно вставить

# Additional log_format

log_format myformat escape=json '{'
  '"remote_addr":"$remote_addr",'
  '"status":$status,'
  '"request_time":$request_time,'
  '"http_referer":"$http_referer"'
  '}';

# End of additional log_format

Поначалу подумал что это прям изян, но потом осознал, что у sed и прочих тяжёлых наследий всё сложно с экранированиями и прочими многострочностями и простой sed -i «/mykeyword/a$myvar» nginx.conf тут не прокатит.
Раз не sed, то чем и как это проще решить?

★★★★★

Если заменить перевод строки на \n, то работает:

$ echo -e 'a\nb\nc' | sed 's/b/b1\nb2\nb3/'
a
b1
b2
b3
c
xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Мм...пока как-то не вырисовывается.
Обилие кавычек сильно всё усложняет, а в некоторых моих попытках шелл даже раскрывает внутренние переменые Nginx(типа $status), получается ещё смешнее

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

Спасибо за идею, получается примерно так:

#!/bin/bash
IFS='' read -r -d '' MYVAR <<"EOF"
# Additional log_format
log_format myformat escape=json '{'
  '"remote_addr":"$remote_addr",'
  '"status":$status,'
  '"request_time":$request_time,'
  '"http_referer":"$http_referer"'
  '}';
# End of additional log_format
EOF


echo "${MYVAR}" > /tmp/foo.bar

sed -i '/mykeyword/r /tmp/foo.bar' nginx.conf

rm /tmp/foo.bar

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

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

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