สาม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 ลบ\n
ewline ที่เพิ่มด้วย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
สคริปต์แบบพกพาจะกำหนดขอบเขต:
ฉลากด้วย\n
ewline หรือ-e
คำสั่งinline xecution ใหม่
:n
- n
กำหนดป้ายชื่อ นี้สามารถกลับไปในเวลาใด ๆ กับทั้งหรือbn
tn
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
หลังจาก\n
ewline ถูกต่อท้ายและ 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
และดังนั้นจึงไม่เป็นประโยชน์เสมอไป