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
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
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.
Ce sujet est intéressant, donc je teste le benchmark de 3 façons:
sed '1d' d.txt > tmp.txt
tail -n +2 d.txt > tmp.txt
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
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
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
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
Vous pouvez utiliser Vim en mode Ex:
ex -s -c '1d|x' file.txt
1
trouver la première ligne
d
supprimer
x
enregistrer et fermer
Pourrait utiliser vim pour ce faire:
vim -u NONE +'1d' +wq! /tmp/test.txt
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
Pour supprimer une ligne de praticiler dans un fichier
Fichier Sed '1d'
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'