วิธีการ sed และแทนที่สตริงด้วยเส้นทางโฟลเดอร์


14

ฉันพยายามเขียนสคริปต์ทุบตีต่อไปนี้:

HOME_DIR=/opt/my_home
find ./CONFIG -type f -exec sed -i "s/_HOME_DIR_/$_HOME_DIR/g" {} \;

บรรทัดที่ฉันต้องการเปลี่ยนในไฟล์คือ:

users                   = "_HOME_DIR_/config/data/_DOMAIN_/users.conf"

ดังนั้นผลลัพธ์ที่ได้จะต้อง:

users                   = "/opt/my_home/config/data/_DOMAIN_/users.conf"

แต่ฉันไม่เข้าใจ ... ฉันคิดว่ามันเป็นเพราะตัวอักษรหลบหนี ...

มีใครบ้างไหมที่จะส่องแสงบ้าง?

ขอบคุณ


คุณหมายถึง (h) ed แสงบางอย่าง
Alexandre Holden Daly

คำตอบ:


23

ในสถานการณ์ที่สตริงแทนที่หรือสตริงรูปแบบมีเครื่องหมายทับคุณสามารถใช้ประโยชน์จากความจริงที่ว่า GNU sed อนุญาตให้มีตัวคั่นอื่นสำหรับคำสั่งทดแทน ตัวเลือกทั่วไปสำหรับตัวคั่นคือไพพ์ไพพ์|หรือแฮช#- ตัวเลือกที่ดีที่สุดของการกำหนดตัวคั่นมักจะขึ้นอยู่กับประเภทของไฟล์ที่กำลังประมวลผล ในกรณีของคุณคุณสามารถลอง

sed -i "s#_HOME_DIR_#$HOME_DIR#"

นอกจากนี้โปรดทราบว่าคุณพิมพ์ผิดชื่อตัวแปร $ HOME_DIR (ไม่ได้เริ่มต้นด้วยเครื่องหมายขีดล่าง)

$ HOME_DIR=/opt/my_home
$ echo "_HOME_DIR_/config/data/_DOMAIN_/users.conf" | sed "s#_HOME_DIR_#$HOME_DIR#"
/opt/my_home/config/data/_DOMAIN_/users.conf

เพียงแค่ fyi คุณอาจต้องการหลีกเลี่ยงการใช้ all-caps สำหรับตัวแปรผู้ใช้ในสคริปต์ของคุณ - ควรสงวนไว้สำหรับตัวแปรระบบ นอกจากนี้ยังgไม่จำเป็นต้องใช้สวิทช์จนกว่าคุณจะต้องการเปลี่ยนหลายรายการในบรรทัดเดียว


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.