Supprimer la première ligne d'un fichier


110

Comment puis-je supprimer la première ligne d'un fichier et conserver les modifications?

J'ai essayé cela, mais cela efface tout le contenu du fichier.

$sed 1d file.txt > file.txt

Réponses:


81

La raison pour laquelle fichier.txt est vide après cette commande correspond à l'ordre dans lequel le shell agit. La première chose qui se passe avec cette ligne est la redirection. Le fichier "fichier.txt" est ouvert et tronqué à 0 octet. Après cela, la commande sed est exécutée, mais le fichier est déjà vide.

Il y a quelques options, la plupart impliquent l'écriture dans un fichier temporaire.

sed '1d' file.txt > tmpfile; mv tmpfile file.txt # POSIX
sed -i '1d' file.txt # GNU sed only, creates a temporary file

perl -ip -e '$_ = undef if $. == 1' file.txt # also creates a temporary file

2
Avec BSD sed, vous pouvez utiliser sed -i .bak '1d' file.txt.

1
y at-il un moyen qui n'inclut pas le fichier temporaire? Quoi qu'il en soit, cela fera l'affaire. Merci beaucoup!
kickass13

@ kickass13 en utilisant éventuellement un éditeur de texte tel que ed.
Jordanie

6
La edcommande serait la suivante: printf "%s\n" 1d w q | ed file.txt(I Heart Ed)
Glenn Jackman

1
@jonayreyes-exec sed -i '1d' {} \;
jordanm

141

Une autre option très légère consiste simplement à "aligner" tout sauf la première ligne (cela peut être un moyen facile de supprimer les en-têtes de fichiers en général):

# -n +2 : start at line 2 of the file.
tail -n +2 file.txt > file.stdout

Après @Evan Teitelman, vous pouvez:

tail -n +2 file.txt | sponge file.txt

Pour éviter un fichier temporaire. Une autre option pourrait être:

echo "$(tail -n +2 file.txt)" > file.txt

Et ainsi de suite. Test du dernier:

[user@work ~]$ cat file.txt
line 1
line 2
line 3
line 4
line 5

[user@work ~]$ echo "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 2
line 3
line 4
line 5
[user@work ~]$ 

Oups nous avons perdu une nouvelle ligne (par le commentaire @ 1_CR ci-dessous), essayez plutôt:

printf "%s\n\n" "$(tail -n +2 file.txt)" > file.txt

[user@work ~]$ cat file.txt
line 1
line 2
line 3
line 4
line 5

[user@work ~]$ printf '%s\n\n' "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 2
line 3
line 4
line 5  

[user@work ~]$ 

En revenant à sed, essayez:

printf '%s\n\n' "$(sed '1d' file.txt)" > file.txt

ou peut-être

echo -e "$(sed '1d' file.txt)\n" > file.txt

Pour éviter les effets secondaires.


Je viens de l'essayer sur mon système Fedora et la sortie est supérieure. Vous avez raison - merci de l'avoir signalé.
AsymLabs

L' tailastuce a fonctionné pour moi (a pris moins de 3 secondes sur un fichier de 130 Mo). Merci!
Elo80ka

echo "$(tail -n +2 file.txt)" > file.txtest la réponse parfaite.
Alex Raj Kaliamoorthy

Je vous remercie! echo "$ (tail -n +2 fichier.txt)">> fichier.txt fonctionne pour moi comme un charme!
Arsenii

16

Jetez aussi un coup d' œil à spongepartir moreutils. spongeabsorbe les données de l'entrée standard jusqu'à ce que la fin de l'écriture de l'entrée standard se ferme avant l'écriture dans un fichier. Il est utilisé comme suit:

sed '1d' file.txt | sponge file.txt

14

Ce sujet est intéressant, je teste donc le benchmark de 3 manières:

  1. sed '1d' d.txt > tmp.txt
  2. tail -n +2 d.txt > tmp.txt
  3. sed -i '1d' d.txt

Notez que la cible d.txtest un fichier de 5,4 Go.

Obtenez le résultat:


run 1 : sed '1d' d.txt > r1.txt
14s
run 2 : tail -n +2 d.txt > r2.txt
20s
run 3 : sed -i '1d' d.txt
88s

Conclusion: Il semble que ci-dessous soit le moyen le plus rapide:

sed '1d' file.txt > tmpfile; mv tmpfile file.txt


Votre sed '1d' d.txtméthode n'inclut pas (ou semble-t-il en lisant vos tests) la mvcommande. Lors de mes tests sur FreeBSD avec un fichier de 20 Mo, sed -ic'était le plus rapide.
Sopalajo de Arrierez

9

expeut être utilisé pour une véritable édition sur place qui ne nécessite pas de fichier temporaire

ex -c ':1d' -c ':wq' file.txt

2
ex utilise un fichier temporaire. strace -e open ex -c ':1d' -c ':wq' foo. ex tronque le fichier d'origine avec le fichier temporaire, où l'option -i de GNU sed écrase l'original avec le fichier temporaire. Je ne suis pas sûr de savoir comment fonctionne sed de BSD.
Llua

@llua, vous avez raison. J'ai remarqué ça aussi, mais plus tard
iruvar

3

Le moyen le plus simple et le plus simple de supprimer la première ligne d'un fichier sedconsiste à:

$ sed -i -n -e '2,$p' file.txt

3

Vous pouvez utiliser Vim en mode Ex:

ex -s -c '1d|x' file.txt
  1. 1 trouver la première ligne

  2. d effacer

  3. x sauver et fermer


0

Cette commande supprimera 1 ligne et enregistrera sous "fichier.txt".

sed '1d' file.txt  > /tmp/file.txt && mv /tmp/file.txt file.txt || rm -f /tmp/file.txt

0

Supprimer une ligne praticiler dans un fichier

  1. Supprimer la première ligne

Sed '1d' file

  1. Supprimer les première et troisième lignes

Sed '1d3d' fichier

Supprimer le caractère en ligne

1 Supprimer les deux premières chartes en ligne

Sed 's /^..//' file

2 Supprimer les deux dernières lignes de ligne

Sed 's / .. £ //' file

3 Supprimer la ligne vide

Fichier Sed '/ ^ £ / d'


4
Les Britanniques ont-ils repris les colonies? La dernière fois que je regardais, £$.
G-Man

£ indiqué signe de poupée ..
Vivek parikh

0

Vim pourrait utiliser ceci:

vim -u NONE +'1d' +wq! /tmp/test.txt

-2

cat file01 | sed -e '1,3d'

// affiche le contenu de file01 mais supprime les première et troisième lignes


2
la commande sed que vous donnez supprimera les lignes 1, 2 et 3.
icarus

1
Cela supprime plus que ce qui est demandé et ne "conserve pas les modifications"
Jeff Schaller
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.