177 votes

Comment utiliser sed pour supprimer les n dernières lignes d'un fichier

Je veux enlever quelques n lignes à partir de la fin d'un fichier. Cela peut-il être fait en utilisant sed ?

Par exemple, pour supprimer les lignes de 2 à 4, je peux utiliser

$ sed '2,4d' file

Mais je ne connais pas les numéros de ligne. Je peux supprimer la dernière ligne en utilisant

$sed $d file

mais je veux connaître le moyen d'enlever n lignes à partir de la fin. Veuillez me dire comment faire cela en utilisant sed ou une autre méthode.

2 votes

@arashkordi : cela utilise un comptage de lignes à partir du haut du fichier, pas du bas.

0 votes

Question connexe sur superutilisateurs .

0 votes

// Peut-être devriez-vous reformuler la question pour la rendre plus générale que juste sed ?

250voto

ams Points 10312

Je ne sais pas sed mais il est possible de le faire avec head :

head -n -2 myfile.txt

24 votes

+1 pour la simplicité. La commande sed équivalente est très moche : sed -e :a -e '$d;N;2,5ba' -e 'P;D' file ( ,5 pour les 5 dernières lignes).

67 votes

Notez que cela fonctionne avec certaines versions de head mais n'est pas standard. En effet, la norme pour head États : The application shall ensure that the number option-argument is a positive decimal integer.

1 votes

@rjdkolb merci pour votre modification, mais les nombres négatifs ont traditionnellement un tiret devant.

37voto

Kyle Points 21

Si le codage en dur de n est une option, vous pouvez utiliser des appels séquentiels à sed. Par exemple, pour supprimer les trois dernières lignes, supprimez la dernière ligne trois fois :

sed '$d' file | sed '$d' | sed '$d'

4 votes

Ceci, plus -i pour éditer le fichier en place plutôt que de le vider sur stdout, a fonctionné pour moi.

0 votes

Je ne sais pas pourquoi | pipe ne fonctionne pas, ça a marché pour moi.

31voto

qstebom Points 248

De la Les "one-liners" de sed :

# delete the last 10 lines of a file
sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # method 1
sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # method 2

Cela semble être ce que vous recherchez.

0 votes

@Thor, vous pouvez modifier le nombre de lignes supprimées du fichier en changeant le paramètre 10 en '$d;N;2,10ba'

1 votes

@AlexejMagura : Je commentais une version antérieure de la réponse.

0 votes

Désolé, je suis assez nouveau dans la commande sed et cela me semble vraiment confus. Comment puis-je spécifier le fichier à appliquer contre avec cette commande ?

22voto

sputnick Points 31663

Une histoire simple et amusante sed y tac solution :

n=4
tac file.txt | sed "1,$n{d}" | tac

NOTE

  • guillemets doubles " sont nécessaires pour que l'obus puisse évaluer le $n variable dans sed commande. Entre guillemets simples, aucune interpolation ne sera effectuée.
  • tac es un cat inversé, voir man 1 tac
  • le site {} en sed sont là pour séparer $n & d (si ce n'est pas le cas, le shell tente d'interpoler des données inexistantes $nd variable)

1 votes

@MichaelDurrant port info coreutils || brew info coreutils ;

19voto

richard Points 101

Vous pourriez utiliser tête pour ça.

Utilisez

$ head --lines=-N file > new_file

où N est le nombre de lignes que vous voulez supprimer du fichier.

Le contenu du fichier original moins les N dernières lignes se trouve maintenant dans nouveau_fichier

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X