วิธีพกพาในการทำเช่นนี้และวิธีที่มีประสิทธิภาพมากขึ้นคือการใช้ที่อยู่ คุณสามารถทำได้:
printf %s\\n cat dog pear banana cat dog |
sed -e '/cat/!{/dog/!b' -e '};cBear'
ด้วยวิธีนี้หากบรรทัดไม่มีcat string และไม่มี string dog sed
b
ranches ออกจากสคริปต์ให้พิมพ์บรรทัดปัจจุบันโดยอัตโนมัติและดึงในถัดไปเพื่อเริ่มรอบถัดไป ดังนั้นจึงไม่ได้ดำเนินการคำสั่งต่อไป - ซึ่งในตัวอย่างนี้c
แขวนทั้งบรรทัดเพื่ออ่านแบร์แต่มันสามารถทำอะไรก็ได้
มันอาจจะเป็นที่น่าสังเกตว่าคำสั่งใด ๆ ต่อไปนี้!b
ในการที่sed
คำสั่งสามารถเฉพาะตรงกับในบรรทัดที่มีทั้งสตริงdog
หรือcat
- เพื่อให้คุณสามารถดำเนินการทดสอบต่อไปโดยไม่เป็นอันตรายของการจับคู่สายที่ไม่ได้ใด ๆ - ซึ่งหมายความว่าตอนนี้คุณสามารถใช้กฎ เพื่อหนึ่งหรืออื่น ๆ เช่นกัน
แต่นั่นคือต่อไป นี่คือผลลัพธ์จากคำสั่งด้านบน:
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
คุณยังสามารถใช้ตารางการค้นหาที่มีการอ้างอิงย้อนหลังได้
printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ cat dog /;x
};G;s/^\(.*\)\n.* \1 .*/Bear/;P;d'
มันทำงานได้มากขึ้นในการตั้งค่าสำหรับกรณีตัวอย่างง่ายๆนี้ แต่มันสามารถสร้างsed
สคริปต์ที่ยืดหยุ่นมากขึ้นในระยะยาว
ในบรรทัดแรกฉันx
เปลี่ยนพื้นที่พักและพื้นที่รูปแบบจากนั้นใส่สตริง<space>
cat <space>
dog<space>
ลงในพื้นที่พักไว้ก่อนที่จะx
เปลี่ยนกลับ
จากนั้นเป็นต้นไปทุกบรรทัดต่อไปนี้ฉันได้G
เว้นวรรคต่อท้ายพื้นที่รูปแบบจากนั้นตรวจสอบเพื่อดูว่าอักขระทั้งหมดจากจุดเริ่มต้นของบรรทัดจนถึงบรรทัดใหม่ที่เพิ่งเพิ่มตอนท้ายตรงกับสตริงที่ล้อมรอบด้วยช่องว่างหลังจากนั้น ถ้าเป็นเช่นนั้นฉันจะแทนที่ล็อตทั้งหมดด้วยBearและหากไม่มีสิ่งใดที่ทำอันตรายได้เพราะฉันต่อไปP
จะทำการขึ้นบรรทัดใหม่ที่เกิดขึ้นครั้งแรกในช่องว่างรูปแบบd
เท่านั้น
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
และเมื่อฉันพูดถึงความยืดหยุ่นฉันหมายถึงมัน นี่คือการแทนที่แมวด้วยBrownBearและสุนัขด้วยBlackBear :
printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ 1cat Brown 2dog Black /;x
};G;s/^\(.*\)\n.* [0-9]\1 \([^ ]*\) .*/\2Bear/;P;d'
###OUTPUT###
BrownBear
BlackBear
pear
banana
BrownBear
BlackBear
แน่นอนว่าคุณสามารถขยายเนื้อหาของตารางการค้นหาได้อย่างมาก - ฉันหยิบความคิดจากอีเมล Usenet ของ Greg Ubbenเกี่ยวกับเรื่องนี้เมื่อในยุค 90 เขาอธิบายว่าเขาสร้างเครื่องคิดเลขหยาบได้อย่างไรจากsed s///
คำสั่งเดียว
-r
ตัวเลือกนี้เพื่อเป็นคำพ้องความหมาย-E
สำหรับความเข้ากันได้กับ GNU sed OpenBSD และ OS Xsed -E
จะตีความไปป์ที่หลบหนีเป็นไพพ์ตามตัวอักษรไม่ใช่ตัวดำเนินการสำรอง นี่คือลิงค์ที่ใช้งานได้ไปยังหน้าคน NetBSD และนี่คือลิงค์สำหรับ OpenBSD ที่มีอายุไม่สิบปี