Que signifie la modification "sur place" d'un fichier, par exemple via sed -i
ou perl -i
signifie?
Ma question est de savoir comment cette modification sur place est effectuée. Le fichier est-il copié, la modification est effectuée dans la copie, puis remplace l'original? Ou est-ce que le fichier d'origine est en quelque sorte modifié en place?
10
ex
ouvi
?ex
maintient un fichier courrier (comme,dead.mail
ou quelque chose en vous, et un autre quelque part près de votre spouleur de messagerie, généralement) . vérifiez les spécifications - chacun d'entre eux a un état défini à de grandes longueurs ...ex
a son propre format binaire dans la plupart des cas (regardez votre-rescue
fichier) et celui-ci est utilisé pour prérégler des fichiers tampons temporaires séparés (peut-être jusqu'à six) . donc ceux-ci copient les blocs d'entrée pour éditer les tampons et les écritures de synchronisation dans les décalages par changement:!written
?Réponses:
sed
crée un fichier temporaire, écrit la sortie dans ce fichier, puis renomme le fichier temporaire par-dessus l'original.Vous pouvez regarder ce qui se passe en utilisant
strace
:Cela enregistre toutes les opérations sur les fichiers
sed
: il crée un nouveau fichier (en toute sécurité avecO_CREAT|O_EXCL
), y écrit les données, puis le remonte par-dessus mon fichier d'originea
.sed -i
accepte un suffixe à utiliser pour une sauvegarde, et dans ce cas, il déplace l'original à l'écart en premier (plutôt que de le renommer par-dessus). Cet argument est obligatoire dans la plupart des BSDsed
. Dans ce cas, il y a un bref moment où il n'y a aucun fichier du bon nom dans le répertoire.perl
dans les versions récentes, ouvre le fichier d'entrée, puis le supprime et crée un nouveau fichier du même nom:Lorsque vous supprimez (
unlink
) un fichier que vous avez déjà ouvert, vous conservez l'accès à celui-ci aussi longtemps que vous gardez la poignée, afin qu'il puisse continuer à lire les données du fichier supprimé. De cette façon,perl
écrit directement dans le fichier de sortie, plutôt que dans un fichier temporaire: aucun fichier supplémentaire n'est créé, mais si vous lisez le fichier pendant le processus, vous obtiendrez un contenu partiel, contrairement àsed
l'approche de. Il y a aussi un bref moment où il n'y a pas de fichier avec le bon nom, qui est au début du processus plutôt qu'à la fin (comme danssed -i .bak
).Les deux
sed
etperl
:setgid
bit) s'il appartenait à un groupe dans lequel vous n'êtes pas et que vous n'êtes pas root.setuid
etsetgrp
bits, si le groupe résultant est le même que le groupe dans lequel il a commencé.sed
volonté:perl
volonté:Ce qui précède est vrai sur Linux avec GNU
sed
et Mac OS X avec son (dérivé de FreeBSD)sed
.la source
En plus de la réponse de @ Homer, de
perldoc perlrun
:Et rappelez-vous qu’aucun lien logiciel ou lien matériel n’est conservé:
Cela explique aussi pourquoi vous devez utiliser
-i
avec-p
option ou utiliser une expliciteprint
déclaration si vous voulez modifier inplace avecperl
:la source