我使用 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