ทุกสิ่งที่พิจารณาว่าการกลืนทั้งไฟล์อาจเป็นวิธีที่เร็วที่สุด
ไวยากรณ์พื้นฐานมีดังนี้:
sed -e '1h;2,$H;$!d;g' -e 's/__YOUR_REGEX_GOES_HERE__...'
โปรดทราบว่าการกลืนไฟล์ทั้งหมดอาจไม่ใช่ตัวเลือกหากไฟล์มีขนาดใหญ่มาก สำหรับกรณีเช่นนี้คำตอบอื่น ๆ ที่ให้ไว้ที่นี่นำเสนอโซลูชันที่ปรับแต่งเองซึ่งรับประกันว่าจะทำงานบนหน่วยความจำขนาดเล็ก
สำหรับสถานการณ์แฮ็คและสแลชอื่น ๆ ทั้งหมดเพียงแค่เตรียม-e '1h;2,$H;$!d;g'
ตามด้วยsed
อาร์กิวเมนต์ regex ดั้งเดิมของคุณ
เช่น
$ echo -e "Dog\nFox\nCat\nSnake\n" | sed -e '1h;2,$H;$!d;g' -re 's/([^\n]*)\n([^\n]*)\n/Quick \2\nLazy \1\n/g'
Quick Fox
Lazy Dog
Quick Snake
Lazy Cat
อะไร-e '1h;2,$H;$!d;g'
ทำอย่างไร
1
, 2,$
, $!
ส่วน specifiers บรรทัดที่ จำกัด ซึ่งบรรทัดคำสั่งโดยตรงวิ่งต่อไปนี้บน
1
: บรรทัดแรกเท่านั้น
2,$
: ทุกบรรทัดเริ่มจากวินาที
$!
: ทุกบรรทัดนอกเหนือจากที่ผ่านมา
ขยายดังนั้นนี่คือสิ่งที่เกิดขึ้นในแต่ละบรรทัดของอินพุตบรรทัด N
1: h, d
2: H, d
3: H, d
.
.
N-2: H, d
N-1: H, d
N: H, g
g
คำสั่งไม่ได้รับการระบุสาย แต่ก่อนd
คำสั่งมีคำสั่งพิเศษ " เริ่มต้นรอบถัดไป. " และนี้จะป้องกันg
จากการทำงานในสายทั้งหมดยกเว้นสุดท้าย
สำหรับความหมายของแต่ละคำสั่ง:
- ครั้งแรก
h
ตามด้วยH
s ในแต่ละสำเนาบรรทัดกล่าวว่าสายของใส่ลงในsed
's ถือพื้นที่ (คิดว่าบัฟเฟอร์ข้อความโดยพลการ)
- หลังจากนั้น
d
ทิ้งแต่ละบรรทัดเพื่อป้องกันไม่ให้บรรทัดเหล่านี้ถูกเขียนไปยังเอาต์พุต พื้นที่ถือแต่ถูกเก็บรักษาไว้
- ในที่สุดในบรรทัดสุดท้าย
g
คืนค่าการสะสมของทุกบรรทัดจากพื้นที่พักเพื่อให้sed
สามารถเรียกใช้ regex ในอินพุตทั้งหมด (แทนที่จะเป็นแบบ line-at-a-time) และด้วยเหตุนี้จึงสามารถ ตรงกับ\n
s