web-dev-qa-db-fra.com

Supprimer la première ligne d'un fichier

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

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

$sed 1d file.txt > file.txt
120
kickass13

La raison pour laquelle file.txt est vide après cette commande est l'ordre dans lequel le shell fait les choses. La première chose qui arrive avec cette ligne est la redirection. Le fichier "file.txt" est ouvert et tronqué à 0 octet. Après cela, la commande sed s'exécute, mais au point où le fichier est déjà vide.

Il existe quelques options, la plupart impliquent d'écrire 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
87
jordanm

Une option alternative très légère consiste à tout "tailler" 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. Dernier test:

[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 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 ~]$ 

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.

155
AsymLabs

Ce sujet est intéressant, donc je teste le benchmark de 3 façons:

  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.txt est 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 ci-dessous être le moyen le plus rapide:

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

17
waue0920

Jetez également un œil à sponge de moreutils . sponge imprègne les données de l'entrée standard jusqu'à la fin de l'écriture de l'entrée standard avant d'écrire dans un fichier. Il est utilisé comme ceci:

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

ex peut être utilisé pour une véritable édition sur place qui n'implique pas de fichier temporaire

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

La façon la plus courte et la plus simple de supprimer la première ligne d'un fichier en utilisant sed est:

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

Vous pouvez utiliser Vim en mode Ex:

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

  2. d supprimer

  3. x enregistrer et fermer

3
Steven Penny

Pourrait utiliser vim pour ce faire:

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

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

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

Pour supprimer une ligne de praticiler dans un fichier

  1. Supprimer la première ligne

Fichier Sed '1d'

  1. Supprimer la première et la troisième ligne

Fichier Sed '1d3d'

Supprimer le caractère en ligne

1 Supprimer les deux premières chartes en lin

Fichier de Sed /^..//

2 Supprimer les deux dernières lignes de chrectercin

Fichier Sed/s. £ // '

3 Supprimer la ligne vierge

Fichier Sed '/ ^ £/d'

0
Vivek parikh