Réponses:
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
ed
.
ed
commande serait la suivante: printf "%s\n" 1d w q | ed file.txt
(I Heart Ed)
-exec sed -i '1d' {} \;
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.
tail
astuce a fonctionné pour moi (a pris moins de 3 secondes sur un fichier de 130 Mo). Merci!
echo "$(tail -n +2 file.txt)" > file.txt
est la réponse parfaite.
Jetez aussi un coup d' œil à sponge
partir
moreutils
. sponge
absorbe 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
Ce sujet est intéressant, je teste donc le benchmark de 3 manières:
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 que ci-dessous soit le moyen le plus rapide:
sed '1d' file.txt > tmpfile; mv tmpfile file.txt
sed '1d' d.txt
méthode n'inclut pas (ou semble-t-il en lisant vos tests) la mv
commande. Lors de mes tests sur FreeBSD avec un fichier de 20 Mo, sed -i
c'était le plus rapide.
ex
peut être utilisé pour une véritable édition sur place qui ne nécessite pas de fichier temporaire
ex -c ':1d' -c ':wq' file.txt
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.
Vous pouvez utiliser Vim en mode Ex:
ex -s -c '1d|x' file.txt
1
trouver la première ligne
d
effacer
x
sauver et fermer
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
Supprimer une ligne praticiler dans un fichier
Sed '1d' file
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'
£
≠ $
.
Vim pourrait utiliser ceci:
vim -u NONE +'1d' +wq! /tmp/test.txt
cat file01 | sed -e '1,3d'
// affiche le contenu de file01 mais supprime les première et troisième lignes
sed
, vous pouvez utilisersed -i .bak '1d' file.txt
.