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
kickass13
la source

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
Jordan
la source
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.

AsymLabs
la source
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

la source
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

waue0920
la source
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
iruvar
la source
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
starfry
la source
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

Steven Penny
la source
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
Ritesh Singh
la source
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'

Vivek Parikh
la source
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
Hongbo Liu
la source
-2

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

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

utilisateur215264
la source
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