ที่นี่มีการตีความสองระดับ: เปลือกและ sed
ในเชลล์ทุกอย่างระหว่างเครื่องหมายคำพูดเดียวจะถูกตีความอย่างแท้จริงยกเว้นเครื่องหมายคำพูดเดียว คุณสามารถมีเครื่องหมายคำพูดเดี่ยวระหว่างเครื่องหมายคำพูดเดี่ยวได้อย่างมีประสิทธิภาพโดยการเขียน'\''(ปิดเครื่องหมายคำพูดเดี่ยวเครื่องหมายคำพูดเดียวหนึ่งตัวและเครื่องหมายคำพูดเดี่ยวเปิด)
sed ใช้การแสดงออกปกติพื้นฐาน ใน BRE เพื่อที่จะให้พวกเขาได้รับการปฏิบัติอย่างแท้จริงตัวละคร$.*[\^จะต้องได้รับการอ้างอิงโดยนำหน้าด้วยแบ็กสแลชยกเว้นชุดอักขระภายใน ( […]) ตัวอักษรตัวเลขและ(){}+?|ต้องไม่ยกมา (คุณสามารถออกไปด้วยการอ้างอิงบางส่วนในการใช้งานบางอย่าง) ลำดับ\(, \), \nและในการใช้งานบาง\{, \}, \+, \?, \|และอื่น ๆ ทับขวา + Alphanumerics มีความหมายพิเศษ คุณสามารถออกไปโดยไม่พูดถึง$^ในบางตำแหน่งในการนำไปใช้งานบางอย่าง
นอกจากนี้คุณต้องมีแบ็กสแลชก่อนที่/จะให้ปรากฏใน regex นอกของนิพจน์วงเล็บเหลี่ยม คุณสามารถเลือกตัวละครอื่นเป็นตัวคั่นโดยการเขียนเช่นs~/dir~/replacement~หรือ\~/dir~p; คุณจะต้องมีแบ็กสแลชต่อหน้าตัวคั่นหากคุณต้องการรวมไว้ใน BRE หากคุณเลือกตัวละครที่มีความหมายพิเศษใน BRE และคุณต้องการรวมมันอย่างแท้จริงคุณจะต้องมีแบ็กสแลชสามตัว ฉันไม่แนะนำสิ่งนี้เนื่องจากมันอาจมีพฤติกรรมแตกต่างกันในการใช้งานบางอย่าง
โดยสรุปสำหรับsed 's/…/…/':
- เขียน regex ระหว่างเครื่องหมายคำพูดเดี่ยว
- ใช้
'\''เพื่อจบด้วยการเสนอราคาเดียวใน regex
- ใส่แบ็กสแลชก่อน
$.*/[\]^และเฉพาะอักขระเหล่านั้นเท่านั้น (แต่ไม่ใช่ภายในนิพจน์วงเล็บเหลี่ยม) (โดยทางเทคนิคแล้วคุณไม่ควรใส่แบ็กสแลชไว้ก่อนหน้านี้]แต่ฉันไม่รู้ว่ามีการนำไปใช้ที่ปฏิบัติ]และ\]แตกต่างจากนิพจน์วงเล็บเหลี่ยม)
- ภายในนิพจน์วงเล็บเหลี่ยมเพื่อ
-ให้ได้รับการปฏิบัติอย่างแท้จริงให้แน่ใจว่ามันเป็นครั้งแรกหรือครั้งสุดท้าย ( [abc-]หรือ[-abc]ไม่[a-bc])
- ภายในแสดงออกวงเล็บสำหรับ
^ที่จะได้รับการปฏิบัติอย่างแท้จริงให้แน่ใจว่ามันไม่ได้เป็นครั้งแรก (ใช้[abc^]ไม่ได้[^abc])
- หากต้องการรวม
]ไว้ในรายการของอักขระที่จับคู่โดยนิพจน์วงเล็บปีกกาให้ตั้งค่าเป็นอักขระตัวแรก (หรือก่อนหลัง^สำหรับเซตที่ถูกทำให้ว่าง): []abc]หรือ[^]abc](ไม่ใช่[abc]]หรือ[abc\]] )
ในข้อความแทนที่:
&และ\จำเป็นต้องมีเครื่องหมายคำนำหน้าโดย backslash เช่นเดียวกับตัวคั่น (ปกติ/) และบรรทัดใหม่
\ตามด้วยตัวเลขมีความหมายพิเศษ \ตามด้วยตัวอักษรมีความหมายพิเศษ (อักขระพิเศษ) ในการใช้งานบางอย่างและ\ตามด้วยตัวอักษรอื่น ๆ หมายถึง\cหรือcขึ้นอยู่กับการใช้งาน
- ด้วยเครื่องหมายคำพูดเดี่ยวรอบ ๆ อาร์กิวเมนต์ (
sed 's/…/…/') ให้ใช้'\''เพื่อใส่เครื่องหมายคำพูดเดี่ยวในข้อความแทนที่
หากข้อความ regex หรือการแทนที่มาจากตัวแปรเชลล์โปรดจำไว้ว่า
- regex เป็น BRE ไม่ใช่สตริงตัวอักษร
- ใน regex จะต้องมีการขึ้นบรรทัดใหม่เป็น
\n(ซึ่งจะไม่ตรงกันเว้นแต่คุณจะมีsedรหัสอื่น ๆ ที่เพิ่มอักขระขึ้นบรรทัดใหม่ลงในพื้นที่รูปแบบ) แต่โปรดทราบว่าจะไม่ทำงานภายในนิพจน์วงเล็บเหลี่ยมด้วยsedการใช้งานบางอย่าง
- ในข้อความทดแทน
&, \และการขึ้นบรรทัดใหม่จะต้องมีการอ้าง
- ตัวคั่นต้องถูกยกมา (แต่ไม่ใช่ภายในนิพจน์วงเล็บเหลี่ยม)
sed -e "s/$BRE/$REPL/"ใช้คำพูดสองสำหรับการแก้ไข:
function sedPath { path=$((echo $1|sed -r 's/([\$\.\*\/\[\\^])/\\\1/g'|sed 's/[]]/\[]]/g')>&1) } #Escape path for use with sed