tête; tête
{ head -n[num] >/dev/null
head -n[num]
} <infile >outfile
Avec ce qui précède, vous pouvez spécifier le premier nombre de lignes à retirer de la tête de la sortie avec la première headcommande, et le nombre de lignes à écrire outfileavec la seconde. Il le fera également généralement plus rapidement que sed- en particulier lorsque l'entrée est volumineuse - bien qu'il nécessite deux appels. Où sedcertainement devrait être préféré cependant, est dans le cas qui <infileest pas régulièrement, lseekable fichier - car cela généralement pas fonctionner comme prévu dans ce cas, mais sedpeut gérer toutes les modifications de sortie dans un seul processus scénarisé.
Avec un GNU, headvous pouvez également utiliser la -forme négative pour [num]dans la deuxième commande. Dans ce cas, la commande suivante supprimera la première et la dernière ligne de l'entrée:
{ head -n1 >/dev/null
head -n-1
} <infile >outfile
OU avec un POSIX sed:
Supposons, par exemple, que je lisais une entrée de 20 lignes et que je voulais supprimer les 3 premiers et les 7 derniers. Si je décidais de le faire avec sed, je le ferais avec un tampon de queue. Je voudrais d'abord additionner trois et sept pour un nombre total de bandes de dix, puis faire:
seq 20 | sed -ne:n -e '3d;N;1,10bn' -eP\;D
C'est un exemple qui supprime les 3 et 7 dernières lignes de l'entrée. L'idée est que vous pouvez mettre en mémoire tampon autant de lignes que vous souhaitez supprimer de la queue de l'entrée dans l'espace de motif sur une pile, mais seulement Préimprimer la première de celles-ci pour chaque ligne tirée.
- On lines
1,10 sed Pn'imprime rien car pour chacun d'entre eux, il empile les entrées ligne par ligne dans un espace de motif dans une bboucle ranch.
- Sur la 3ème ligne, la totalité de
sedla pile est dterminée - et donc les 3 premières lignes sont supprimées de la sortie en un seul coup.
- Lorsqu'il
sedatteint la $dernière ligne d'entrée et tente d'extraire l' Nextension, il frappe EOF et arrête complètement le traitement. Mais à ce moment-là, l'espace de motif contient toutes les lignes 14,20- dont aucune n'a encore été Pimprimée, et ne le sont jamais.
- Sur toutes les autres lignes,
sed Pne s'imprime que jusqu'à la première ligne \nélectronique apparaissant dans l'espace de motif, et les Dsupprime avant de commencer un nouveau cycle avec ce qui reste - ou les 6 lignes d'entrée suivantes. La 7ème ligne est à nouveau ajoutée à la pile avec la Ncommande ext dans le nouveau cycle.
Et donc, de seqla sortie de (qui est 20 lignes numérotées séquentiellement) , sedimprime uniquement:
4
5
6
7
8
9
10
11
12
13
Cela devient problématique lorsque le nombre de lignes que vous souhaitez supprimer de la queue d'entrée est important, car sedles performances de sont directement proportionnelles à la taille de son espace de motif. Pourtant, c'est une solution viable dans de nombreux cas - et POSIX spécifie un sedespace de modèle pour gérer au moins 4 Ko avant de se casser.