มีไม่กี่วิธีที่จะไปเกี่ยวกับเรื่องนี้เป็น W sed/ วิธีหนึ่งคือการอ่านล่าช้าตามที่แนะนำในคำตอบที่ยอมรับ มันสามารถเขียนได้เช่น:
sed -e '$!N;P;/\nPointer/r file1' -e D file2
... ด้วยการมองไปข้างหน้าเล็กน้อยอย่างชัดเจนแทนที่จะใช้ look-behind ที่อื่นถูกใช้กับบัฟเฟอร์การพัก นั่นจะมีปัญหาเดียวกันกับบรรทัดสุดท้ายที่ @don_crissti บันทึกอย่างหลีกเลี่ยงไม่ได้เพราะN จะเพิ่มรอบของบรรทัดและrคำสั่ง ead จะถูกใช้โดยหมายเลขบรรทัด
คุณสามารถไปรอบ ๆ มัน:
echo | sed -e '$d;N;P;/\nPointer/r file1' -e D file2 -
ไม่ใช่ว่าทุกคนsedจะตีความ-หมายถึงอินพุตมาตรฐาน แต่มีหลายคนที่ทำ ( POSIX บอกว่า sedควรสนับสนุน-ให้มีความหมายเป็นมาตรฐานหากผู้ดำเนินการต้องการ-หมายถึงมาตรฐานใน)
อีกวิธีคือจัดการเนื้อหาที่ต่อท้ายตามลำดับ มีคำสั่งอื่นที่กำหนดเวลาการส่งออกในแบบเดียวกับที่อีดrทำและsedจะนำไปใช้และได้rรับตามลำดับที่พวกเขาเขียนสคริปต์ มันมีส่วนเกี่ยวข้องมากกว่านิดหน่อย - มันเกี่ยวข้องกับการใช้หนึ่งsedเพื่อaเชื่อมการPointerแข่งขันกับผลลัพธ์ของอีกอันsedในสคริปต์
sed ' /Pointer/!d #only operate on first match
s/[]^$&\./*[]/\\&/g;H #escape all metachars, Hold
s|.*|/&/!p;//!d|p;g #print commands, exchange
s|.|r file1&a\\&|;q' file2| #more commands, quit
sed -nf - file2 #same input file
ดังนั้นโดยทั่วไปคนแรกsedเขียนsedสคริปต์ตัวที่สองซึ่งตัวที่สองsedอ่านในอินพุตมาตรฐาน(อาจ ... )และนำไปใช้ในทางกลับกัน ครั้งแรกsedเท่านั้นที่ทำงานในการแข่งขันครั้งแรกสำหรับการPointerค้นพบและหลังจากนั้นquits อินพุต หน้าที่ของมันคือ ...
s/[]^$&\./*[]/\\&/g;H
- ตรวจสอบให้แน่ใจว่าตัวอักษรรูปแบบทั้งหมดมีเครื่องหมายแบ็กสแลชอย่างปลอดภัยเนื่องจากตัวที่สอง
sedจะต้องตีความทุก ๆ บิตที่อ่านอย่างแท้จริงเพื่อทำให้ถูกต้อง เมื่อเสร็จแล้วใส่สำเนาในHพื้นที่เก่า
s|.*|/&/!p;//!d|p; x
- บอกวินาที
sedเพื่อprint ทุก ๆ บรรทัดอินพุต!แต่/&/อันที่เราเพิ่งเก็บรักษารูปแบบ จากนั้นให้dลบล้างสิ่งเดียวกันทั้งหมด pเรียกใช้คำสั่งในครั้งที่สองsedจากนั้นxเปลี่ยนe hและบัฟเฟอร์แบบเก่าเพื่อทำงานกับสำเนาที่เราบันทึกไว้
s|.|r file1&a\\&|p;q
- ถ่านตัวเดียวที่เราทำงานด้วยที่นี่คือ
\newline เพราะsedจะได้Hรับการเติมก่อนเมื่อเราเข้าแถวมาก่อน ดังนั้นเราจึงแทรกคำสั่งr file1และปฏิบัติตามด้วย\newline ของเราจากนั้นคำสั่งa\\สำหรับappend ตามด้วย\newline ส่วนที่เหลือทั้งหมดของHบรรทัดแรกของเราเป็นไปตาม\newline สุดท้าย
สคริปต์ที่เขียนครั้งแรกมีลักษณะดังนี้:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
โดยทั่วไปที่สองsedจะพิมพ์ทุกบรรทัด แต่บรรทัดแรกsedจะตั้งค่าเป็นappend สำหรับว่าสายโดยเฉพาะอย่างยิ่งสองเขียนล่าช้ามาตรฐานออกจะกำหนดเวลา - ครั้งแรกเป็นrอี๊ดของfile1และสองคือสำเนาของเส้นที่เราต้องการหลังจากที่มัน การsedแพทย์คนแรกไม่จำเป็นแม้แต่ในกรณีนี้(ดู? ไม่มีแบ็กสแลช)แต่มันเป็นเรื่องสำคัญที่จะต้องหลบหนีอย่างปลอดภัยในวิธีที่ฉันทำที่นี่เมื่อใดก็ตามที่รูปแบบการจับคู่ถูกเปลี่ยนเป็นอินพุต
อย่างไรก็ตาม ... มีสองสามวิธี