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 wc
plusieurs astuces).
Actuellement, utiliser une solution de contournement avec head
et tail
combinée wc
pour le faire. Des rebondissements rapides ici?
head
ettail
...head
et lestail
connaissances sur les différentes saveurs?Réponses:
in sed
$
est la dernière ligne, donc supprimer la dernière ligne:la source
sed -i '$d' <file>
pour éditer le fichier en place.$ pour la dernière ligne:
la source
sed '$d' file; sed '$d' file
sed '$d' file
ne modifie pas réellement le fichier; il affiche simplement le contenu du fichier, moins la dernière ligne. Ainsised '$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 desed '$d' file
estsed '$d' file | sed '$d'
.sed -n '1{h;n;}; $q; x; p;'
. Je boudais ce que nous ne pouvons pas fairesed '$-1,$d'
.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 parEOF
, ou\n
ensuiteEOF
), le nombre de lignesnew_file.txt
peut être le même (quefile.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.
la source
head -n -1 file.txt > new_file.txt
. Notez cependant que les comptes négatifshead -n
ne sont disponibles que pour certaines implémentations dehead
. Par exemple, cela ne fonctionne pas pour FreeBSD ou pour la version BusyBox dehead
.head -n -1 file.txt > new_file.txt
c'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.)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
ethead
font partie decoreutils
-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.1Je 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.
la source
Linux
$ est la dernière ligne, d pour supprimer:
MacOS
Équivalent du sed -i
la source