วิธีพกพาในการทำเช่นนี้และวิธีที่มีประสิทธิภาพมากขึ้นคือการใช้ที่อยู่ คุณสามารถทำได้:
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 ที่มีอายุไม่สิบปี