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 head
commande, et le nombre de lignes à écrire outfile
avec 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ù sed
certainement devrait être préféré cependant, est dans le cas qui <infile
est pas régulièrement, lseekable fichier - car cela généralement pas fonctionner comme prévu dans ce cas, mais sed
peut gérer toutes les modifications de sortie dans un seul processus scénarisé.
Avec un GNU, head
vous 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 P
réimprimer la première de celles-ci pour chaque ligne tirée.
- On lines
1,10
sed
P
n'imprime rien car pour chacun d'entre eux, il empile les entrées ligne par ligne dans un espace de motif dans une b
boucle ranch.
- Sur la 3ème ligne, la totalité de
sed
la pile est d
terminée - et donc les 3 premières lignes sont supprimées de la sortie en un seul coup.
- Lorsqu'il
sed
atteint la $
dernière ligne d'entrée et tente d'extraire l' N
extension, 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é P
imprimée, et ne le sont jamais.
- Sur toutes les autres lignes,
sed
P
ne s'imprime que jusqu'à la première ligne \n
électronique apparaissant dans l'espace de motif, et les D
supprime 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 N
commande ext dans le nouveau cycle.
Et donc, de seq
la sortie de (qui est 20 lignes numérotées séquentiellement) , sed
imprime 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 sed
les 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 sed
espace de modèle pour gérer au moins 4 Ko avant de se casser.