web-dev-qa-db-fra.com

Supprimer la dernière ligne du fichier

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

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 l'obtenir en utilisant wc et plusieurs autres astuces).

Actuellement, utiliser une solution de contournement avec head et tailcombiné avec wc pour ce faire. Des rebondissements rapides ici?

51
mtk

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

sed '$d' <file>
96
h3rrmiller

$ pour la dernière ligne:

sed '$d' file
32
Guru

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

Attention, semble-t-il, selon la dernière ligne de file.txt (s'il se termine par EOF ou \n puis EOF), le nombre de lignes dans new_file.txt peut être le même (que file.txt) après cette commande (cela se produit lorsqu'il n'y a pas de \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 cat et redirigez vers le même fichier, vous l'effacerez.

15
Emanuel Berg

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)

tail et head font partie des coreutils- rpm (au moins pour les systèmes basés sur rpm).

Selon le changelog de coreutils, cette syntaxe est prise en charge 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 - au 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 sais pas si RH5.5. a déjà la version coreutils qui le prend en charge. Mais 5.5 a quand même EoLed.

6
Nils

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
2
jasonleonhard