Điểm:0

sed: tùy chỉnh tiêu đề tệp cấu hình với độ dài xác định?

lá cờ us

Tôi sử dụng sed để tùy chỉnh các tệp cấu hình bộ chứa LXC từ máy chủ LXC. Điều đó hoạt động tốt cho đến nay. Khi điều chỉnh tiêu đề nhận xét (tên máy chủ và ngày tháng), có vấn đề về thẩm mỹ với chiều rộng của tiêu đề, vì khi tên máy chủ có độ dài khác nhau được thay thế, tổng chiều rộng của cây thạch nam không được tự động bù vào cuối.

trong ví dụ của tôi, chuỗi SERVER nên được thay thế.

############################
# Cấu hình RSYSLOG #
# MÁY CHỦ:/etc/rsyslog.conf #
# t12@RMS 2020-03-23 ​​#
############################
############################
# Cấu hình RSYSLOG #
# gersrv:/etc/rsyslog.conf #
# t12@RMS 2020-04-23 #
############################
############################
# Cấu hình RSYSLOG #
# sv4:/etc/rsyslog.conf #
# t12@RMS 2020-06-23 #
############################

Làm thế nào tôi có thể nhận được điều này với sed? Hay tôi cần awk?

sed -i "s/SERVER/${servername}/g" /path to container/etc/rsyslog.conf
Điểm:1
lá cờ in

Ở đây bạn là một giải pháp:

Tôi sử dụng độ dài của đường gạch ngang đầu tiên làm tham chiếu độ dài.

#! /bin/bash

RSYSLOG_FILENAME="/etc/rsyslog.conf"

awk -v servername="$1" '
/^#+$/ {
    dấu gạch ngang = chiều dài($0)
    in
    tiếp theo
}
/^# MÁY CHỦ:/ {
    str = "# " tên máy chủ ":/etc/rsyslog.conf"
    nspace = ndash - chiều dài (str) - 1
    nếu (nspace < 1) { nspace = 1 }
    printf("%s%*.*s#\n", str, nspace, nspace, "")
    tiếp theo
}
{
    in
}
' "${RSYSLOG_FILENAME}" > "${RSYSLOG_FILENAME}.tmp"

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

CẬP NHẬT

Đối với nhiều tệp .

Tập tin: ./sysconf.sh

#! /bin/bash

khai báo -r SERVER_NAME="$1"
sự thay đổi

cho CONF_FILENAME trong "${@}"; làm
    awk -v servername="${SERVER_NAME}" '
    /^#+$/ {
        dấu gạch ngang = chiều dài($0)
        in
        tiếp theo
    }
    /^# MÁY CHỦ:/ {
        khớp($0, /[: ][^: #]*[ #]/, arr)
        fn = mảng [0]
        gsub(/[: #]/, "", fn)
        str = "# " tên máy chủ ":" fn
        nspace = ndash - chiều dài (str) - 1
        nếu (nspace < 1) { nspace = 1 }
        printf("%s%*.*s#\n", str, nspace, nspace, "")
        tiếp theo
    }
    {
        in
    }
    ' "${CONF_FILENAME}" > "${CONF_FILENAME}.tmp"
    mv "${CONF_FILENAME}.tmp" "${CONF_FILENAME}"
xong

Được sử dụng như vậy:

./sysconf.sh sv4 /etc/rsyslog.conf /etc/mysql/mariadb.cnf
questor avatar
lá cờ us
cảm ơn, hoạt động tốt. Nhưng một điểm là mở. Tập lệnh của tôi sẽ thay đổi tiêu đề của tệp cấu hình cho các dịch vụ khác nhau trong nhiều Vùng chứa, không chỉ rsyslog. có nghĩa là /etc/rsyslog.conf chỉ là ví dụ và không thể được sử dụng làm chuỗi tĩnh # MÁY CHỦ:/etc/rsyslog.conf # # MÁY CHỦ:/etc/mysql/mariadb.cnf # # MÁY CHỦ:/etc/ldap/ldap.conf # trong sed có các câu lệnh \1 \2 để giữ một chuỗi nếu khớp với bộ lọc. không chắc chắn nếu tương tự là cần thiết trong awk.
Arnaud Valmary avatar
lá cờ in
Tôi đã cập nhật giải pháp của mình cho bất kỳ tên tệp nào

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.