Supprimer la dernière ligne du fichier

44

J'utilise sed pour supprimer rapidement des lignes avec une position spécifique

sed '1d'
sed '5d'

Mais que se passe-t-il si je veux supprimer la dernière ligne du fichier et que je ne connais pas le nombre de lignes (je sais que je peux obtenir cela en utilisant wcplusieurs astuces).

Actuellement, utiliser une solution de contournement avec headet tailcombinée wcpour le faire. Des rebondissements rapides ici?

mtk
la source
Quel os? Certaines saveurs ont des options intéressantes pour headet tail...
Nils
@Nils Je suis sur la «Red Hat Enterprise Linux Server version 5.5 (Tikanga)». Pouvez-vous indiquer les options headet les tailconnaissances sur les différentes saveurs?
MTK
J'ai fait. Voir ci-dessous.
Nils

Réponses:

88

in sed $est la dernière ligne, donc supprimer la dernière ligne:

sed '$d' <file>
h3rrmiller
la source
12
Utilisez sed -i '$d' <file>pour éditer le fichier en place.
WanderingMind
1
Que serait-il pour supprimer les n dernières lignes, où n est un nombre entier?
Joshua Salazar
31

$ pour la dernière ligne:

sed '$d' file
Gourou
la source
10
vous battre de 30 secondes: P
h3rrmiller
1
Malheureusement, il faut utiliser des techniques plus complexes pour supprimer, par exemple, les deux dernières lignes.
dubiousjim
Que voulez-vous dire? sed '$d' file; sed '$d' file
Rob
3
@Rob: sed '$d' filene modifie pas réellement le fichier; il affiche simplement le contenu du fichier, moins la dernière ligne. Ainsi sed '$d' file; sed '$d' file, le contenu du fichier sera imprimé deux fois , moins la dernière ligne à chaque fois. L'équivalent-supprimer-le-dernier-deux-lignes de sed '$d' fileest sed '$d' file | sed '$d'.
Ruakh
2
Ouais, c'est inélégant mais bien sûr ça marche. Je le ferais en un seul passage avec sed -n '1{h;n;}; $q; x; p;'. Je boudais ce que nous ne pouvons pas faire sed '$-1,$d'.
dubiousjim
14

cat file.txt | head -n -1 > new_file.txt

Attention, semble-t-il, en fonction de la dernière ligne de file.txt(si elle se termine par EOF, ou \nensuite EOF), le nombre de lignes new_file.txtpeut être le même (que file.txt) après cette commande (cela se produit s'il n'y en a pas \n) - dans tous les cas, le contenu de la dernière ligne est supprimé.

Notez également que vous devez utiliser un deuxième fichier (intermédiaire). Si vous chattez et redirigez vers le même fichier, vous l'effacerez.

Emanuel Berg
la source
6
Là où cela fonctionne, cela pourrait aussi être simplement head -n -1 file.txt > new_file.txt. Notez cependant que les comptes négatifs head -nne sont disponibles que pour certaines implémentations de head. Par exemple, cela ne fonctionne pas pour FreeBSD ou pour la version BusyBox de head.
dubiousjim
1
@dubiousjim: D'accord, head -n -1 file.txt > new_file.txtc'est mieux. Cela fonctionne de la même manière en ce qui concerne mes deux commentaires (même nombre de lignes et effacer sur le même fichier). En ce qui concerne l'argument négatif, de telles différences se produisent de temps en temps entre Unix et elles sont souvent frustrantes car vous vous attendez à ce qu'il s'agisse entièrement de la même commande (et pourquoi ne voudriez-vous pas - même nom et même but!)? point. (J'utilise Debian.)
Emanuel Berg
5

head --lines=-1. Je suis d'abord tombé sur cette possibilité dans la page de manuel de head sur un système SLES11SP2 (coreutils-8.12-6.23.1)

tailet headfont partie de coreutils-rpm (au moins pour les systèmes basés sur rpm).

Selon le changelog de coreutils, cette syntaxe est supportée depuis coreutils-version 5.0.1

Mauvaise nouvelle: selon la page de manuel RH5, cette option n'est pas décrite.

Bonne nouvelle: cela fonctionne avec RH5 (donc dans votre cas: cela fonctionne - du moins avec une version actuelle de RH5).

rpm -q coreutils me montre (sur CentOS 5.8): coreutils-5.97-34.el5_8.1

Je ne suis pas sûr si RH5.5. a déjà la version coreutils qui le supporte. Mais 5.5 a quand même réussi.

Nils
la source
+1 cela fonctionne parfaitement sur RH5.5. Merci.
MTK
0

Linux

$ est la dernière ligne, d pour supprimer:

sed '$d' ~/path/to/your/file/name

MacOS

Équivalent du sed -i

sed -i '' -e '$ d' ~/path/to/your/file/name
jasonleonhard
la source