ฉันลองใช้รหัสต่อไปนี้เพื่อแทนที่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ตอนนี้พยายามที่จะเข้ามาแทนที่การเกิดขึ้นของตัวอักษรทุกโดย$var1ZZ
ใช้เครื่องหมายคำพูดคู่เพื่อทำให้เชลล์ขยายตัวแปรขณะที่รักษาช่องว่าง:
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 /และมันมี การสลับไปใช้|เป็นตัวคั่นแก้ไขปัญหาของฉัน