ที่นี่มีการตีความสองระดับ: เปลือกและ 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