จะหลีกเลี่ยงเส้นทางไฟล์ใน SED ได้อย่างไร


39

ผมอยากจะเข้ามาแทนที่$fileWithPathใน$fileอย่างไรก็ตามเรื่องนี้ไม่ได้เพราะ (ฉันคิด) เส้นทางไม่ได้หนี วิธีการหนี

sed -i 's/${fileWithPath}/HAHA/g' $file

คำตอบ:


71
sed -i 's|'$fileWithPath'|HAHA|g' file

เครื่องหมายคำพูดเดี่ยวกำหนดสตริงตัวอักษร การวางตัวแปรนอกตัวอักษรทำให้เชลล์สามารถขยายส่วนนั้นได้

นอกจากนี้หากคุณกำลังจะแยกวิเคราะห์เส้นทางให้ใช้ตัวคั่นในคำสั่ง sed ที่ไม่สับสนกับตัวคั่นไดเรกทอรี "/"


1
ระวังว่าถ้า$fileWithPathมีช่องว่างรูปแบบที่ผิดจะถูกแทรก
Lekensteyn

เคล็ดลับโบนัสของคุณเกี่ยวกับการเปลี่ยนตัวคั่นสำหรับเส้นทางของไฟล์เป็นเครื่องมือช่วยชีวิต!
Shadoninja

ฉันคิดว่าคุณมีคำพูดมากเกินไปในคำสั่งของคุณ ตัวอย่างของฉันsed -i 's|auth-user-pass nordvpn.txt|auth-user-pass /etc/openvpn/nordvpn.txt|g' *.ovpnดูเหมือนจะใช้ได้
LéoLéopold Hertz 준영

14

วิธีที่ดีกว่าสำหรับสตริงตัวอักษรที่มีเครื่องหมายสแลช:

sed -i "s|my/path|my/other/path|g" myFileOfPaths.txt

อันนี้สมควรได้รับออสการ์! เรียบง่ายและสง่างาม
Toan Nguyen

14

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

sed -i 's#'$fileWithPath'#HAHA#g' $file

อักขระ 'g' หลังจาก#สุดท้ายถูกใช้เพื่อเปลี่ยนการเกิดขึ้นทั้งหมดในไฟล์หากคุณต้องการเปลี่ยนเฉพาะการปรากฏครั้งแรกเท่านั้นจากนั้นจึงลบ 'g'

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