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.