ฉันจะใช้ตัวแปรในคำสั่ง sed ได้อย่างไร


266

ฉันลองใช้รหัสต่อไปนี้เพื่อแทนที่QQด้วยZZแต่ไม่ได้ทำสิ่งที่ฉันต้องการ:

var1=QQ
sed -i 's/$var1/ZZ/g' $file

อย่างไรก็ตามรหัสนี้ทำในสิ่งที่ฉันต้องการ:

sed -i 's/QQ/ZZ/g' $file

ฉันจะใช้ตัวแปรได้sedอย่างไร



คำตอบ:


358

เชลล์รับผิดชอบการขยายตัวแปร เมื่อคุณใช้ราคาเดียวสำหรับสตริงเนื้อหาของมันจะได้รับการปฏิบัติอย่างแท้จริงดังนั้น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/

2
หนึ่งจะผ่านตัวเลือก "/ g" โดยใช้แบบฟอร์มคั่นด้วยเครื่องหมายจุลภาคนี้ได้อย่างไร
blong

6
@ b.long มันเป็นgตัวเลือกดังนั้นคุณจะผ่านs,foo,bar,gแทน
Lekensteyn

1
ตัวอย่างคำพูดเดียวของคุณมีประโยชน์อย่างยิ่งครอบคลุมการใช้ลวดลาย regex อย่างดี!
Brian Thomas

ในกรณีที่คุณถูกล่อลวงให้ใช้\\0แทนที่จะ\0ไม่ควรทำเมื่อ\0อยู่ในเครื่องหมายคำพูดเดี่ยว มิฉะนั้นsedจะแทนที่รูปแบบตัวอักษร\0แทนการแข่งขันทั้งหมด
Lekensteyn

เคล็ดลับสำหรับฉัน
jimh

114

เราสามารถใช้ตัวแปรในการsedใช้เครื่องหมายคำพูดคู่:

sed -i "s/$var/r_str/g" file_name

หากคุณมีเครื่องหมายสแลช/ในตัวแปรให้ใช้ตัวคั่นอื่นเช่นด้านล่าง:

sed -i "s|$var|r_str|g" file_name

7
หากคุณมีเครื่องหมายสแลช/ในตัวแปร => สิ่งนี้ช่วยฉันได้! ตัวแปรของฉันคือ URL /และมันมี การสลับไปใช้|เป็นตัวคั่นแก้ไขปัญหาของฉัน
sonlexqt

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