สามsedคำสั่งต่าง ๆ:
sed '$!N;s/"[^"]*"\n<[^>]*>/other characters /;P;D'
sed -e :n -e '$!N;s/"[^"]*"\n<[^>]*>/other characters /;tn'
sed -e :n -e '$!N;/"$/{$!bn' -e '};s/"[^"]*"\n<[^>]*>/other characters /g'
พวกเขาทั้งสามสร้างตามs///คำสั่ง ubstitution พื้นฐาน:
s/"[^"]*"\n<[^>]*>/other characters /
พวกเขาทุกคนพยายามที่จะจัดการกับบรรทัดสุดท้ายเนื่องจากsedมีแนวโน้มที่จะแตกต่างกันไปในกรณีที่ขอบ นี่คือความหมายของ$!ที่อยู่ซึ่งตรงกับทุกบรรทัดที่!ไม่ใช่บรรทัด$สุดท้าย
พวกเขายังใช้Nคำสั่ง ext เพื่อผนวกบรรทัดอินพุตถัดไปเข้ากับพื้นที่รูปแบบหลังจาก\nอักขระ ewline ทุกคนที่ได้รับsedในขณะที่จะได้เรียนรู้ที่จะพึ่งพา\nตัวละคร ewline - เพราะวิธีเดียวที่จะได้รับหนึ่งคือการวางไว้ที่นั่นอย่างชัดเจน
ทั้งสามพยายามอ่านอินพุตให้น้อยที่สุดเท่าที่จะทำได้ก่อนที่จะลงมือsedทำทันทีที่ทำได้และไม่จำเป็นต้องอ่านในไฟล์อินพุตทั้งหมดก่อนที่จะดำเนินการ
แม้ว่าพวกเขาจะทำทุกอย่างNพวกเขาทั้งสามต่างวิธีในการเรียกซ้ำ
คำสั่งแรก
คำสั่งแรกใช้การN;P;Dวนซ้ำง่ายมาก คำสั่งทั้งสามนี้มีอยู่ในตัวของ POSIX ที่เข้ากันได้sedและเสริมเข้าด้วยกัน
คำสั่งนี้เรียกใช้ซ้ำสำหรับบรรทัดที่ไม่ตรงกับs///คำสั่ง ubstitution เท่านั้น เนื่องจากs///ubstitution ลบ\newline ที่เพิ่มด้วยNดังนั้นจะไม่มีสิ่งใดเหลืออยู่เมื่อsed Dลบพื้นที่รูปแบบ
การทดสอบสามารถทำได้เพื่อนำไปใช้Pและ / หรือDคัดเลือก แต่มีคำสั่งอื่น ๆ ที่เหมาะสมกับกลยุทธ์นั้นดีกว่า เนื่องจากการเรียกซ้ำถูกนำมาใช้เพื่อจัดการบรรทัดที่ต่อเนื่องซึ่งตรงกับเพียงส่วนหนึ่งของกฎการแทนที่ลำดับที่ต่อเนื่องของบรรทัดที่ตรงกับปลายทั้งสองของs///ubtion ไม่ทำงานได้ดี:
รับข้อมูลนี้:
first "line"
<second>"line"
<second>"line"
<second>line and so on
... มันพิมพ์ ...
first other characters "line"
<second>other characters line and so on
อย่างไรก็ตามมันจัดการได้
first "line"
second "line"
<second>line
... ไม่เป็นไร
คำสั่งที่สอง
คำสั่งนี้คล้ายกับคำสั่งที่สามมาก ทั้งสองใช้ฉลาก:bฟาร์มปศุสัตว์ / เอสต์(ตามที่แสดงในคำตอบของ Joeseph R. ที่นี่ด้วย )และนำกลับมาใช้ใหม่ตามเงื่อนไขที่กำหนดt
-e :n -e- sedสคริปต์แบบพกพาจะกำหนดขอบเขต:ฉลากด้วย\newline หรือ-eคำสั่งinline xecution ใหม่
:n- nกำหนดป้ายชื่อ นี้สามารถกลับไปในเวลาใด ๆ กับทั้งหรือbntn
tn- tคำสั่ง est ส่งกลับไปยังเลเบลที่ระบุ(หรือหากไม่ได้จัดเตรียมไว้ให้ออกจากสคริปต์สำหรับบรรทัดวงจรปัจจุบัน)หากการs///แทนที่ใด ๆตั้งแต่เลเบลถูกกำหนดหรือเนื่องจากถูกเรียกใช้ครั้งล่าสุดว่าtประสบความสำเร็จ
ในคำสั่งนี้การสอบถามซ้ำเกิดขึ้นสำหรับบรรทัดที่ตรงกัน หากsedแทนที่ลวดลายสำเร็จด้วยอักขระอื่นให้sedกลับไปที่:nป้ายกำกับแล้วลองอีกครั้ง หากs///ubstitut ไม่ได้ทำการsedพิมพ์อัตโนมัติ pattern-space และเริ่มรอบบรรทัดถัดไป
สิ่งนี้มีแนวโน้มที่จะจัดการกับลำดับที่ต่อเนื่องดีกว่า ที่สุดท้ายที่ล้มเหลวพิมพ์นี้:
first other characters other characters other characters line and so on
คำสั่งที่สาม
ดังที่ได้กล่าวมาแล้วตรรกะที่นี่คล้ายกันมากกับที่ผ่านมา แต่การทดสอบมีความชัดเจนมากขึ้น
/"$/bn- นี่คือsedการทดสอบของ เนื่องจากbคำสั่ง ranch เป็นฟังก์ชั่นของที่อยู่นี้sedจะbกลับไปที่ ranch :nหลังจาก\newline ถูกต่อท้ายและ pattern-space ยังคงลงท้ายด้วยเครื่องหมาย"คำพูดคู่
มีการทำเพียงเล็กน้อยระหว่างNและbเท่าที่จะทำได้ด้วยวิธีนี้sedสามารถรวบรวมอินพุตได้มากเท่าที่จำเป็นเพื่อให้แน่ใจว่าบรรทัดต่อไปนี้ไม่ตรงกับกฎของคุณ s///ubstitution แตกต่างกันที่นี่ในการที่จะมีพนักงานgธง lobal - และเพื่อที่จะทำทดแทนที่จำเป็นทั้งหมดในครั้งเดียว รับอินพุตที่เหมือนกันคำสั่งนี้เอาต์พุตเหมือนกันกับครั้งสุดท้าย
\nงบ ewline ที่คุณทำคือเหตุผลที่ผมถาม ผู้คนไม่ค่อยถามว่าพวกเขาสามารถทำs//\n/ตามที่คุณสามารถทำได้กับ GNUsedหรือไม่แม้ว่าคนอื่น ๆ ส่วนใหญ่sedจะปฏิเสธการหลบหนีนั้นทางด้านขวามือ ยังคงการ\nหลบหนีจะทำงานทางด้านซ้ายใน POSIX ใด ๆsedและคุณสามารถแปลได้เหมือนกันy/c/\n/แม้ว่ามันจะมีผลเช่นเดียวกับs/c/\n/gและดังนั้นจึงไม่เป็นประโยชน์เสมอไป