Score:0

sed: ปรับแต่งส่วนหัวของไฟล์ config ด้วยความยาวที่กำหนด?

ธง us

ฉันใช้ sed เพื่อปรับแต่งไฟล์คอนฟิกูเรชันคอนเทนเนอร์ LXC จากโฮสต์ LXC ใช้งานได้ดีจนถึงตอนนี้ เมื่อปรับส่วนหัวของความคิดเห็น (ชื่อโฮสต์และวันที่) จะมีปัญหาเกี่ยวกับความสวยงามเกี่ยวกับความกว้างของส่วนหัว เนื่องจากเมื่อมีการแทนที่ชื่อโฮสต์ที่มีความยาวต่างกัน ความกว้างทั้งหมดของเฮเทอร์จะไม่ได้รับการชดเชยโดยอัตโนมัติในตอนท้าย

ในตัวอย่างของฉันควรแทนที่สตริง SERVER

############################
# การกำหนดค่า RSYSLOG #
# เซิร์ฟเวอร์:/etc/rsyslog.conf #
# t12@RMS 2020-03-23 ​​#
############################
############################
# การกำหนดค่า RSYSLOG #
# gersrv:/etc/rsyslog.conf #
# t12@RMS 2020-04-23 #
############################
############################
# การกำหนดค่า RSYSLOG #
# sv4:/etc/rsyslog.conf #
# t12@RMS 2020-06-23 #
############################

ฉันจะรับสิ่งนี้ด้วย sed ได้อย่างไร หรือฉันต้องการ awk?

sed -i "s/SERVER/${servername}/g" /path ไปยังคอนเทนเนอร์/etc/rsyslog.conf
Score:1
ธง in

คุณคือทางออก:

ฉันใช้ความยาวของเส้นขีดแรกเป็นตัวอ้างอิงความยาว

#! /ถัง/ทุบตี

RSYSLOG_FILENAME="/etc/rsyslog.conf"

awk -v ชื่อเซิร์ฟเวอร์ = "$1" '
/^#+$/ {
    ndash = ความยาว ($ 0)
    พิมพ์
    ต่อไป
}
/^# เซิร์ฟเวอร์:/ {
    str = "# " ชื่อเซิร์ฟเวอร์ ":/etc/rsyslog.conf"
    nspace = ndash - ความยาว (str) - 1
    ถ้า (nspace < 1) { nspace = 1 }
    printf("%s%*.*s#\n", str, nspace, nspace, "")
    ต่อไป
}
{
    พิมพ์
}
' "${RSYSLOG_FILENAME}" > "${RSYSLOG_FILENAME}.tmp"

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

อัปเดต

สำหรับหลายไฟล์

ไฟล์: ./sysconf.sh

#! /ถัง/ทุบตี

ประกาศ -r SERVER_NAME="$1"
กะ

สำหรับ CONF_FILENAME ใน "${@}"; ทำ
    awk -v ชื่อเซิร์ฟเวอร์="${SERVER_NAME}" '
    /^#+$/ {
        ndash = ความยาว ($ 0)
        พิมพ์
        ต่อไป
    }
    /^# เซิร์ฟเวอร์:/ {
        ตรงกัน($0, /[: ][^: #]*[ #]/, arr)
        fn = arr[0]
        gsub(/[: #]/, "", fn)
        str = "# " ชื่อเซิร์ฟเวอร์ ":" fn
        nspace = ndash - ความยาว (str) - 1
        ถ้า (nspace < 1) { nspace = 1 }
        printf("%s%*.*s#\n", str, 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 flag
ขอบคุณ ทำงานได้ดี แต่จุดหนึ่งเปิดอยู่ สคริปต์ของฉันควรเปลี่ยนส่วนหัวของไฟล์กำหนดค่าสำหรับบริการต่างๆ ในหลายคอนเทนเนอร์ ไม่ใช่เฉพาะ rsyslog หมายถึง /etc/rsyslog.conf เป็นเพียงตัวอย่างเท่านั้น และไม่สามารถใช้เป็นสตริงคงที่ได้ # เซิร์ฟเวอร์:/etc/rsyslog.conf # # เซิร์ฟเวอร์:/etc/mysql/mariadb.cnf # # เซิร์ฟเวอร์:/etc/ldap/ldap.conf # ใน sed มีคำสั่ง \1 \2 ที่จะเก็บสตริงถ้าตรงกับตัวกรอง ไม่แน่ใจว่าจำเป็นต้องใช้สิ่งที่คล้ายกันใน awk หรือไม่
Arnaud Valmary avatar
in flag
ฉันได้อัปเดตโซลูชันสำหรับชื่อไฟล์ใดๆ แล้ว

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา