голова; голова
{ 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-й рядок знову додається до стеку командою N
ext у новому циклі.
І так, з seq
виходу «S (який є 20 послідовно пронумерованих рядків) , sed
тільки відбитки:
4
5
6
7
8
9
10
11
12
13
Це стає проблематичним, коли кількість ліній, які ви бажаєте зняти з хвоста введення, велика - тому sed
що продуктивність прямо пропорційна розміру простору шаблону. Однак, в багатьох випадках це життєздатне рішення - і POSIX розраховує sed
простір шаблону, щоб обробляти принаймні 4 кбіт перед тим, як перебирати його.