ฉันลองใช้รหัสต่อไปนี้เพื่อแทนที่QQ
ด้วยZZ
แต่ไม่ได้ทำสิ่งที่ฉันต้องการ:
var1=QQ
sed -i 's/$var1/ZZ/g' $file
อย่างไรก็ตามรหัสนี้ทำในสิ่งที่ฉันต้องการ:
sed -i 's/QQ/ZZ/g' $file
ฉันจะใช้ตัวแปรได้sed
อย่างไร
ฉันลองใช้รหัสต่อไปนี้เพื่อแทนที่QQ
ด้วยZZ
แต่ไม่ได้ทำสิ่งที่ฉันต้องการ:
var1=QQ
sed -i 's/$var1/ZZ/g' $file
อย่างไรก็ตามรหัสนี้ทำในสิ่งที่ฉันต้องการ:
sed -i 's/QQ/ZZ/g' $file
ฉันจะใช้ตัวแปรได้sed
อย่างไร
คำตอบ:
เชลล์รับผิดชอบการขยายตัวแปร เมื่อคุณใช้ราคาเดียวสำหรับสตริงเนื้อหาของมันจะได้รับการปฏิบัติอย่างแท้จริงดังนั้นsed
ตอนนี้พยายามที่จะเข้ามาแทนที่การเกิดขึ้นของตัวอักษรทุกโดย$var1
ZZ
ใช้เครื่องหมายคำพูดคู่เพื่อทำให้เชลล์ขยายตัวแปรขณะที่รักษาช่องว่าง:
sed -i "s/$var1/ZZ/g" "$file"
เมื่อคุณต้องการอักขระเครื่องหมายคำพูดในสตริงการแทนที่คุณจะต้องนำหน้าด้วยเครื่องหมายแบ็กสแลชซึ่งเชลล์จะถูกตีความ ในตัวอย่างต่อไปนี้สตริงquote me
จะถูกแทนที่ด้วย"quote me"
(ตัวละคร&
ถูกตีความโดยsed
):
sed -i "s/quote me/\"&\"/" "$file"
หากคุณมี meta-shell จำนวนมากให้ลองใช้เครื่องหมายคำพูดเดี่ยวสำหรับรูปแบบและเครื่องหมายคำพูดคู่สำหรับตัวแปร:
sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"
แจ้งให้ทราบว่าผมใช้s,pattern,replacement,
แทนs/pattern/replacement/
ผมก็ทำมันเพื่อหลีกเลี่ยงการรบกวนกับใน/
\0/
จากนั้นเชลล์จะรันคำสั่งดังกล่าวsed
ด้วยอาร์กิวเมนต์ถัดไป (สมมติว่าpattern=bert
และfile=text.txt
):
-i
s,bert,Say hurrah to &: \0/,
text.txt
หากfile.txt
มีbert
ผลลัพธ์จะเป็น:
Say hurrah to bert: \0/
g
ตัวเลือกดังนั้นคุณจะผ่านs,foo,bar,g
แทน
\\0
แทนที่จะ\0
ไม่ควรทำเมื่อ\0
อยู่ในเครื่องหมายคำพูดเดี่ยว มิฉะนั้นsed
จะแทนที่รูปแบบตัวอักษร\0
แทนการแข่งขันทั้งหมด
เราสามารถใช้ตัวแปรในการsed
ใช้เครื่องหมายคำพูดคู่:
sed -i "s/$var/r_str/g" file_name
หากคุณมีเครื่องหมายสแลช/
ในตัวแปรให้ใช้ตัวคั่นอื่นเช่นด้านล่าง:
sed -i "s|$var|r_str|g" file_name
/
ในตัวแปร => สิ่งนี้ช่วยฉันได้! ตัวแปรของฉันคือ URL /
และมันมี การสลับไปใช้|
เป็นตัวคั่นแก้ไขปัญหาของฉัน