sed:使用定义的长度定制配置文件头?

sed:使用定义的长度定制配置文件头?

我使用 sed 从 LXC 主机自定义 LXC 容器配置文件。到目前为止,效果很好。调整注释标题(主机名和日期)时,标题的宽度存在美观问题,因为当替换长度不同的主机名时,标题的总宽度不会在末尾自动补偿。

在我的示例中,应该替换字符串 SERVER。

############################
# RSYSLOG Konfiguration    #
# SERVER:/etc/rsyslog.conf #
# t12@RMS 2020-03-23       #
############################
############################
# RSYSLOG Konfiguration    #
# gersrv:/etc/rsyslog.conf   #
# t12@RMS 2020-04-23       #
############################
############################
# RSYSLOG Konfiguration    #
# sv4:/etc/rsyslog.conf   #
# t12@RMS 2020-06-23       #
############################

我怎样才能用 sed 得到这个?还是需要 awk?

sed -i "s/SERVER/${servername}/g" /path to container/etc/rsyslog.conf

答案1

这是一个解决方案:

我使用第一条虚线的长度作为长度参考。

#! /bin/bash

RSYSLOG_FILENAME="/etc/rsyslog.conf"

awk -v servername="$1" '
/^#+$/ {
    ndash = length($0)
    print
    next
}
/^# SERVER:/ {
    str = "# " servername ":/etc/rsyslog.conf"
    nspace = ndash - length(str) - 1
    if (nspace < 1) { nspace = 1 }
    printf("%s%*.*s#\n", str, nspace, nspace, "")
    next
}
{
    print
}
' "${RSYSLOG_FILENAME}" > "${RSYSLOG_FILENAME}.tmp"

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

更新

对于多个文件。

文件:./sysconf.sh

#! /bin/bash

declare -r SERVER_NAME="$1"
shift

for CONF_FILENAME in "${@}"; do
    awk -v servername="${SERVER_NAME}" '
    /^#+$/ {
        ndash = length($0)
        print
        next
    }
    /^# SERVER:/ {
        match($0, /[: ][^: #]*[ #]/, arr)
        fn = arr[0]
        gsub(/[: #]/, "", fn)
        str = "# " servername ":" fn
        nspace = ndash - length(str) - 1
        if (nspace < 1) { nspace = 1 }
        printf("%s%*.*s#\n", str, nspace, nspace, "")
        next
    }
    {
        print
    }
    ' "${CONF_FILENAME}" > "${CONF_FILENAME}.tmp"
    mv "${CONF_FILENAME}.tmp" "${CONF_FILENAME}"
done

用法如下:

./sysconf.sh sv4 /etc/rsyslog.conf /etc/mysql/mariadb.cnf

相关内容