Рейтинг:0

sed: настроить заголовок файла конфигурации с определенной длиной?

флаг us

Я использую sed для настройки файлов конфигурации контейнера LXC с хоста LXC. Пока это работает хорошо. При настройке заголовков комментариев (имя хоста и дата) возникают эстетические проблемы с шириной заголовков, так как при замене имени хоста с разной длиной общая ширина вереска не компенсируется автоматически в конце.

в моем примере строка SERVER должна быть заменена.

#############################
# Конфигурация RSYSLOG #
# СЕРВЕР:/etc/rsyslog.conf #
# t12@RMS 23.03.2020 #
#############################
#############################
# Конфигурация RSYSLOG #
# gersrv:/etc/rsyslog.conf #
# t12@RMS 23.04.2020 #
#############################
#############################
# Конфигурация RSYSLOG #
# sv4:/etc/rsyslog.conf #
# t12@RMS 23.06.2020 #
#############################

Как я могу получить это с помощью sed? Или мне нужен awk?

sed -i "s/SERVER/${имя_сервера}/g" /путь к контейнеру/etc/rsyslog.conf
Рейтинг:1
флаг in

Вот вам решение:

Я использую длину первой штриховой линии в качестве эталона длины.

#! /бин/баш

RSYSLOG_FILENAME="/etc/rsyslog.conf"

awk -v имя_сервера="$1" '
/^#+$/ {
    ndash = длина ($0)
    Распечатать
    следующий
}
/^# СЕРВЕР:/ {
    str = "# " имя_сервера ":/etc/rsyslog.conf"
    nspace = ndash - длина (строка) - 1
    если (nspace < 1) {nspace = 1}
    printf("%s%*.*s#\n", строка, nspace, nspace, "")
    следующий
}
{
    Распечатать
}
' "${RSYSLOG_FILENAME}" > "${RSYSLOG_FILENAME}.tmp"

mv "${RSYSLOG_FILENAME}.tmp" "${RSYSLOG_FILENAME}"

ОБНОВИТЬ

Для нескольких файлов.

Файл: ./sysconf.sh

#! /бин/баш

объявить -r ИМЯ_СЕРВЕРА = "$1"
сдвиг

для CONF_FILENAME в "${@}"; делать
    awk -v имя_сервера="${ИМЯ_СЕРВЕРА}" '
    /^#+$/ {
        ndash = длина ($0)
        Распечатать
        следующий
    }
    /^# СЕРВЕР:/ {
        match($0, /[: ][^: #]*[ #]/, обр.)
        фн = обр[0]
        gsub(/[: #]/, "", fn)
        str = "# " имя_сервера ":" fn
        nspace = ndash - длина (строка) - 1
        если (nspace < 1) {nspace = 1}
        printf("%s%*.*s#\n", строка, nspace, nspace, "")
        следующий
    }
    {
        Распечатать
    }
    ' "${CONF_FILENAME}" > "${CONF_FILENAME}.tmp"
    mv "${CONF_FILENAME}.tmp" "${CONF_FILENAME}"
сделано

Используется так:

./sysconf.sh sv4 /etc/rsyslog.conf /etc/mysql/mariadb.cnf
questor avatar
флаг us
спасибо, работает нормально. Но один момент открыт. Мой сценарий должен изменить заголовок файлов конфигурации для различных служб в нескольких контейнерах, а не только для rsyslog. означает, что /etc/rsyslog.conf является только примером и не может использоваться как статическая строка # СЕРВЕР:/etc/rsyslog.conf # # СЕРВЕР:/etc/mysql/mariadb.cnf # # СЕРВЕР:/etc/ldap/ldap.conf # в sed есть операторы \1 \2 для сохранения строки, если она соответствует фильтру. не уверен, что подобное нужно в awk.
Arnaud Valmary avatar
флаг in
Я обновил свое решение для любых имен файлов

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.