Je veux supprimer quelques n lignes 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 savoir comment supprimer n lignes de la fin. S'il vous plaît laissez-moi savoir comment faire cela en utilisant sed ou une autre méthode.
sed
?sed $d file
renvoie une erreur. Au lieu de cela, $ d devrait être entre guillemets, comme ceci:sed '$d' file
Réponses:
Je ne sais pas
sed
, mais cela peut être fait avechead
:la source
sed -e :a -e '$d;N;2,5ba' -e 'P;D' file
(,5
pour les 5 dernières lignes).head
, mais n'est pas standard. En effet, la norme pour leshead
états:The application shall ensure that the number option-argument is a positive decimal integer.
head: illegal line count -- -2
Si le codage en dur 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:
la source
Des one-liners sed :
Semble être ce que vous recherchez.
la source
10
in'$d;N;2,10ba'
Un drôle et simple ,
sed
ettac
solution:REMARQUE
"
sont nécessaires pour que le shell évalue la$n
variable dans lased
commande. Entre guillemets simples, aucune interpolation ne sera effectuée.tac
est uncat
inversé, voirman 1 tac
{}
insed
sont là pour séparer$n
&d
(sinon, le shell essaie d'interpoler une$nd
variable inexistante )la source
tac
on osxport info coreutils
||brew info coreutils
;Utilisez
sed
, mais laissez le shell faire le calcul, le but étant d'utiliser lad
commande en donnant une plage (pour supprimer les 23 dernières lignes):Pour supprimer les 3 dernières lignes, de l'intérieur vers l'extérieur:
Donne le nombre de lignes du fichier: dis 2196
Nous voulons supprimer les 23 dernières lignes, donc pour le côté gauche ou la plage:
Donne: 2174 Ainsi, le sed original après l'interprétation de la coque est:
Avec
-i
la modification sur place, le fichier est maintenant 2173 lignes!Si vous souhaitez l'enregistrer dans un nouveau fichier, le code est:
la source
Vous pouvez utiliser la tête pour cela.
Utilisation
$ head --lines=-N file > new_file
où N est le nombre de lignes que vous souhaitez supprimer du fichier.
Le contenu du fichier d'origine moins les N dernières lignes sont maintenant dans new_file
la source
Par souci d'exhaustivité, j'aimerais ajouter ma solution. J'ai fini par faire ça avec le standard
ed
:Cela supprime les 2 dernières lignes à l' aide de montage en place (bien qu'il n'utilise un fichier temporaire dans !!)
/tmp
la source
Pour tronquer les fichiers très volumineux réellement en place, nous avons une
truncate
commande. Il ne connaît pas les lignes, maistail
+wc
peut convertir des lignes en octets:Il existe une condition de concurrence évidente si le fichier est écrit en même temps. Dans ce cas, il peut être préférable d'utiliser
head
- il compte les octets à partir du début du fichier (disque mental IO), donc nous tronquerons toujours la limite de ligne (éventuellement plus de lignes que prévu si le fichier est écrit activement):Une seule ligne pratique si vous échouez à la tentative de connexion en mettant le mot de passe à la place du nom d'utilisateur:
la source
Cela pourrait fonctionner pour vous (GNU sed):
la source
'
).d
,D
ouP
avec GNU sed et pas sur la version posix. Il semble que les lignes ne soient pas imprimées aprèsD
et restent dans la mémoire tampon de travail pour une nouvelle boucle sans passer à la «fin» de la ligne d'actions.D
fait l'effet inverse.La plupart des réponses ci-dessus semblent nécessiter des commandes / extensions GNU:
Pour une solution légèrement plus portable:
OU
OU
Où "10" est "n".
la source
Avec les réponses ici, vous auriez déjà appris que sed n'est pas le meilleur outil pour cette application.
Cependant, je pense qu'il existe un moyen de le faire en utilisant sed; L'idée est d'ajouter N lignes pour contenir de l'espace jusqu'à ce que vous puissiez lire sans toucher EOF. Lorsque EOF est atteint, imprimez le contenu de l'espace d'attente et quittez.
La commande sed ci-dessus omettra les 5 dernières lignes.
la source
Essayez la commande suivante:
la source
=
.tail -r
là où les autres ont utilisétac
pour inverser l'ordre des lignes et faire des dernièresn
lignes lesn
premières lignes.Cela peut se faire en 3 étapes:
a) Comptez le nombre de lignes du fichier que vous souhaitez éditer:
b) Soustrayez de ce nombre le nombre de lignes à supprimer:
c) Dites à sed de supprimer de ce numéro de ligne (
$x
) jusqu'à la fin:la source
sed
pour supprimer les lignes 7 à 10, soit 4 lignes, pas 3.Vous pouvez obtenir le nombre total de lignes avec
wc -l <file>
et utiliserhead -n <total lines - lines to remove> <file>
la source
Cela supprimera les 3 dernières lignes de
file
:for i in $(seq 1 3); do sed -i '$d' file; done;
la source
sed
.Je préfère cette solution;
où N est le nombre de lignes à supprimer.
la source
version posix
la source
Pour supprimer les 4 dernières lignes:
la source
tac file | sed '1,4d' | tac
parce que trier puis supprimer le préfixe coûte beaucoup de ressources.tac
commande dans certains systèmes (par exemple FreeBSD?)Je suis venu avec ceci, où n est le nombre de lignes que vous souhaitez supprimer:
C'est un petit rond-point, mais je pense que c'est facile à suivre.
la source
Pour supprimer les N dernières lignes d'un fichier, vous pouvez utiliser le même concept de
Vous pouvez utiliser un combo avec la commande tail pour inverser le fichier: si N vaut 5
Et cette manière fonctionne également là où la
head -n -5 file
commande ne s'exécute pas (comme sur un mac!).la source
Cela supprimera les 12 dernières lignes
la source