голова; голова
{ head -n[num] >/dev/null
head -n[num]
} <infile >outfile
За допомогою вищесказаного ви можете вказати перше число рядків, яке слід відкреслити від голови виводу w / першої headкоманди, і кількість рядків, до яких слід записати outfileдругу. Зазвичай це робиться швидше, ніж, sedособливо, коли вхід великий, незважаючи на те, що потрібно два виклики. Де, sedбезумовно, слід віддати перевагу, - це у випадку, якщо <infileце не звичайний файл , який можна шукати - оскільки це, як правило, не працює за призначенням у тому випадку, але sedможе обробляти всі модифікації виводу в одному сценарії.
За допомогою GNU headви можете також використовувати -негативну форму для [num]другої команди. У такому випадку наступна команда зніме перший і останній рядки з введення:
{ head -n1 >/dev/null
head -n-1
} <infile >outfile
АБО з POSIX sed:
Скажімо, наприклад, я читав введення з 20 рядків і хотів зняти перші 3 та останні 7. Якщо я вирішив це зробити w / sed, я би зробив це з хвостовим буфером. Я б спершу склав три і сім за загальної кількості смужок десяти, а потім зробив:
seq 20 | sed -ne:n -e '3d;N;1,10bn' -eP\;D
Це приклад, який знімає з введення перші 3 та останні 7 рядків. Ідея полягає в тому, що ви можете буферувати стільки ліній, скільки хочете, щоб зняти з хвоста введення в просторі шаблону на стеку, але лише Pнакреслити перший з них для кожного стягнутого рядка.
- У рядках
1,10 sed Pнічого не вказується, тому що для кожного з них він укладає вхід у простір шаблонів по рядку в bциклі ранчо.
- У 3-му рядку всі стеки
sed's dвибрані - і тому перші 3 рядки позбавляються від виходу одним махом.
- Коли
sedдоходить до $останнього рядка введення і намагається втягнути зовнішній Nудар, він потрапляє на EOF і припиняє обробку цілком. Але в цей час простір шаблону містить усі рядки 14,20- жоден з яких ще не був Pроздрукований і ніколи не є.
- У будь-якому іншому рядку
sed Pвказується лише до першої \nлінії, що виникає в просторі шаблону, і Dвибирається однаково, перш ніж починати новий цикл із тим, що залишається - або наступними 6 рядками введення. 7-й рядок знову додається до стеку командою Next у новому циклі.
І так, з seqвиходу «S (який є 20 послідовно пронумерованих рядків) , sedтільки відбитки:
4
5
6
7
8
9
10
11
12
13
Це стає проблематичним, коли кількість ліній, які ви бажаєте зняти з хвоста введення, велика - тому sedщо продуктивність прямо пропорційна розміру простору шаблону. Однак, в багатьох випадках це життєздатне рішення - і POSIX розраховує sedпростір шаблону, щоб обробляти принаймні 4 кбіт перед тим, як перебирати його.