มีไม่กี่วิธีที่จะไปเกี่ยวกับเรื่องนี้เป็น 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
ค้นพบและหลังจากนั้นq
uits อินพุต หน้าที่ของมันคือ ...
s/[]^$&\./*[]/\\&/g;H
- ตรวจสอบให้แน่ใจว่าตัวอักษรรูปแบบทั้งหมดมีเครื่องหมายแบ็กสแลชอย่างปลอดภัยเนื่องจากตัวที่สอง
sed
จะต้องตีความทุก ๆ บิตที่อ่านอย่างแท้จริงเพื่อทำให้ถูกต้อง เมื่อเสร็จแล้วใส่สำเนาในH
พื้นที่เก่า
s|.*|/&/!p;//!d|p; x
- บอกวินาที
sed
เพื่อp
rint ทุก ๆ บรรทัดอินพุต!
แต่/&/
อันที่เราเพิ่งเก็บรักษารูปแบบ จากนั้นให้d
ลบล้างสิ่งเดียวกันทั้งหมด p
เรียกใช้คำสั่งในครั้งที่สองsed
จากนั้นx
เปลี่ยนe h
และบัฟเฟอร์แบบเก่าเพื่อทำงานกับสำเนาที่เราบันทึกไว้
s|.|r file1&a\\&|p;q
- ถ่านตัวเดียวที่เราทำงานด้วยที่นี่คือ
\n
ewline เพราะsed
จะได้H
รับการเติมก่อนเมื่อเราเข้าแถวมาก่อน ดังนั้นเราจึงแทรกคำสั่งr file1
และปฏิบัติตามด้วย\n
ewline ของเราจากนั้นคำสั่งa\\
สำหรับa
ppend ตามด้วย\n
ewline ส่วนที่เหลือทั้งหมดของH
บรรทัดแรกของเราเป็นไปตาม\n
ewline สุดท้าย
สคริปต์ที่เขียนครั้งแรกมีลักษณะดังนี้:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
โดยทั่วไปที่สองsed
จะพิมพ์ทุกบรรทัด แต่บรรทัดแรกsed
จะตั้งค่าเป็นa
ppend สำหรับว่าสายโดยเฉพาะอย่างยิ่งสองเขียนล่าช้ามาตรฐานออกจะกำหนดเวลา - ครั้งแรกเป็นr
อี๊ดของfile1
และสองคือสำเนาของเส้นที่เราต้องการหลังจากที่มัน การsed
แพทย์คนแรกไม่จำเป็นแม้แต่ในกรณีนี้(ดู? ไม่มีแบ็กสแลช)แต่มันเป็นเรื่องสำคัญที่จะต้องหลบหนีอย่างปลอดภัยในวิธีที่ฉันทำที่นี่เมื่อใดก็ตามที่รูปแบบการจับคู่ถูกเปลี่ยนเป็นอินพุต
อย่างไรก็ตาม ... มีสองสามวิธี