sed ล้มเหลวด้วยข้อผิดพลาด“ ตัวเลือกที่ไม่รู้จักเพื่อ `s '”


158

ฉันพยายามใช้

sed -i -e "s/.*seb.*/    \"$ftp_login_template\"/" $ftp_dir

อย่างไรก็ตามฉันได้รับข้อผิดพลาดนี้:

sed: -e expression #1, char 34: unknown option to `s'

ฉันไม่เข้าใจว่าทำไมเพราะสิ่งนี้ทำงานได้อย่างสมบูรณ์:

sed -i -e "s/.*wbspassword.*/    \"wbspassword\": \"$password\",/" $user_conf

มีความคิดเห็นเกี่ยวกับสิ่งที่ฉันทำผิดหรือเปล่า?

นี่อาจเป็นปัญหาหรือไม่ ftp_login_template=\${user}:${password}:24:86::\/var\/lib\/clit.${user}\/downloads:\/bin\/false\"


8
ข้อความแสดงข้อผิดพลาด * BSD (รวมถึง OSX) คือ "การตั้งค่าสถานะไม่ถูกต้องในคำสั่งสำรอง:" - รวมถึงที่นี่เพื่อให้ googlable นี้ค่อนข้างมากขึ้น
tripleee

คำตอบ:


355

ปัญหาเกิดขึ้นกับเครื่องหมายสแลช: ตัวแปรของคุณมีพวกเขาและคำสั่งสุดท้ายจะเป็นสิ่งที่ต้องการsed "s/string/path/to/something/g"มีวิธีทับหลาย ๆ

เนื่องจากsedสามารถใช้อักขระแทนอักขระใด ๆ (โดยไม่ต้องประกาศตัวคั่นใหม่) คุณสามารถลองใช้อักขระอื่นที่ไม่ปรากฏในสตริงการแทนที่ของคุณ:

replacement="/my/path"
sed --expression "s@pattern@$replacement@"

โปรดทราบว่านี่ไม่ใช่การพิสูจน์ด้วยกระสุน: หากสตริงการแทนที่ในภายหลัง@นั้นจะมีการแตกด้วยเหตุผลเดียวกันและลำดับแบ็กสแลชใด ๆ เช่น\1จะยังคงถูกตีความตามsedกฎ ใช้เป็นตัวคั่นยังเป็นตัวเลือกที่ดีที่สุดเท่าที่มันจะคล้ายกันในการอ่านเพื่อ|/


38
เพียงแค่บันทึกเพื่อช่วยผู้ใช้ในอนาคตฉันพบว่าคำตอบนี้มีประโยชน์เช่นกัน โปสเตอร์ต้นฉบับน่าจะมีบางอย่างที่มาแทนที่ (ส่วนใหญ่ซ่อนอยู่ในตัวแปร) ที่มีเครื่องหมายทับอยู่ด้านหน้า หลังจากพบเครื่องหมายทับแรกแล้ว Sed พิจารณาว่าการแทนที่ถูกยกเลิกและสิ่งใดก็ตามที่เข้ามาเป็นตัวเลือก (เช่นg)
Brian Warshaw

4
ทำอย่าง ( แต่อย่าลืมที่จะตัดการแสดงออกตัวแปรที่มี"ไม่ได้'มิฉะนั้นคุณจะได้รับจำนวนมากของ$contentในสิ้นผลของคุณแทนเนื้อหาของ$content:))

1
@AbstractDissonance บางทีหากคุณกำลังเปลี่ยนรหัสผ่านหรือสิ่งที่แปลกหรือสุ่มคุณยังมี @ อยู่ในนั้น คุณต้องหาตัวคั่นที่ไม่มีอยู่ในสตริงการแทนที่ของคุณ
Xavi Montero

5
@ppumkin เพียงแทนที่ตัวคั่น "forward slash" เช่น: sed -i "s/../../g"ด้วยอักขระที่แตกต่างกันเช่น: sed -i "s@...@...@g"ดังนั้นปัญหาของเครื่องหมายทับหลาย ๆ อันควรหายไป และถ้าคุณใช้"แทนก็ควรทำงานได้ดีกับตัวแปรภายในเช่น:' export var1=bar; sed -i "s@foo@${var1}@g"ข้อมูลเพิ่มเติมคุณสามารถดูเอกสารที่น่ากลัว: grymoire.com/Unix/Sed.html
Egel

1
โปรดดูที่info sed(ที่มา: unix.stackexchange.com/questions/259083/… ): "ไวยากรณ์ของคำสั่ง s (แทน) คือ 's / regexp / replace / flag' ตัวอักษร / อาจถูกแทนที่ด้วยชุดอักขระอื่น ๆ อักขระเดี่ยวภายในคำสั่ง s ที่กำหนด "
Gabriel Staples
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.