testa; testa
{ head -n[num] >/dev/null
head -n[num]
} <infile >outfile
Con quanto sopra è possibile specificare il primo numero di righe da rimuovere dalla testa dell'output con il primo headcomando e il numero di righe su cui scrivere outfilecon il secondo. In genere lo farà anche più velocemente di sed- specialmente quando l'input è grande - nonostante richiedano due invocazioni. Dove sedsicuramente dovrebbe essere preferito, tuttavia, è che non si<infile tratta di un file normale e ricercabile , perché in genere non funzionerà come previsto in quel caso, ma può gestire tutte le modifiche di output in un singolo processo con script.sed
Con una GNU headpuoi usare anche il -modulo negativo [num]nel secondo comando. Nel qual caso il seguente comando eliminerà la prima e l'ultima riga dall'input:
{ head -n1 >/dev/null
head -n-1
} <infile >outfile
O con POSIX sed:
Supponiamo, ad esempio, che stavo leggendo un input di 20 righe e che volessi rimuovere il primo 3 e l'ultimo 7. Se avessi deciso di farlo w / sed, lo avrei fatto con un buffer di coda. Prima aggiungerei tre e sette per un conteggio totale delle strisce di dieci e poi farei:
seq 20 | sed -ne:n -e '3d;N;1,10bn' -eP\;D
Questo è un esempio che rimuove le prime 3 e le ultime 7 righe dall'input. L'idea è che è possibile eseguire il buffer di tutte le righe che si desidera rimuovere dalla coda dell'input nello spazio del motivo su una pila, ma Pstampare il primo di questi solo per ogni riga inserita.
- Sulle righe
1,10 sed Pnon stampa nulla perché per ognuna di esse è impilare l'input nello spazio del modello riga per riga in un bciclo ranch.
- Sulla terza riga
sedviene deliminato tutto lo stack - e quindi le prime 3 righe vengono eliminate dall'output in un colpo solo.
- Quando
sedraggiunge l' $ultima riga di input e tenta di inserire l'estensione N, colpisce EOF e interrompe l'elaborazione completamente. Ma a quel tempo lo spazio del modello contiene tutte le linee 14,20- nessuna delle quali è stata ancora Psfilacciata e mai lo è.
- Su ogni altra linea si
sed Plimita solo fino alla prima \newline che si verifica nello spazio del modello ed Delimina la stessa prima di iniziare un nuovo ciclo con ciò che rimane - o le successive 6 linee di input. La settima riga viene nuovamente aggiunta allo stack con il Ncomando ext nel nuovo ciclo.
E così, seqdell'output (che è di 20 righe numerate in sequenza) , sedstampa solo:
4
5
6
7
8
9
10
11
12
13
Ciò diventa problematico quando il numero di righe che si desidera eliminare dalla coda dell'input è elevato, poiché sedle prestazioni sono direttamente proporzionali alla dimensione del suo spazio del modello. Tuttavia, in molti casi è una soluzione praticabile - e POSIX specifica uno sedspazio modello per gestire almeno 4kb prima del busting.