Rediriger la sortie de sed 's/c/d/' monfichier à myFile
Je suis à l'aide de sed dans un script pour faire un remplacement et je veux avoir le fichier remplacé écraser le fichier. Normalement, je pense que vous pouvez utiliser ceci:
% sed -i 's/cat/dog/' manipulate
sed: illegal option -- i
Cependant comme vous pouvez le voir mon sed ne dispose pas de cette commande.
J'ai essayé ceci:
% sed 's/cat/dog/' manipulate > manipulate
Mais cela ne fait que manipuler dans un fichier vide (de sens).
Cela fonctionne:
% sed 's/cat/dog/' manipulate > tmp; mv tmp manipulate
Mais je me demandais si il y avait un moyen standard pour rediriger la sortie dans le même fichier que l'entrée a été prise.
- Comment se fait personne n'a indiqué
sponge
? - Je suppose que la question n'était pas éponge-digne.
Vous devez vous connecter pour publier un commentaire.
J'ai souvent l'utilisation de la 3ème voie, mais avec un changement important:
$ sed 's/cat/dog/' manipulate > tmp && mv tmp manipulate
I. e. changement
;
à&&
ainsi, le mouvement ne se produit que si le sed est réussi; sinon, vous allez perdre votre fichier d'origine dès que vous faites une faute de frappe dans votre sed syntaxe.Note! Pour ceux qui lisent le titre et disparus de l'OP contrainte "mon sed ne prend pas en charge
-i
": Pour la plupart des gens, sed va soutenir-i
, de sorte que la meilleure façon de le faire est:$ sed -i 's/cat/dog/' manipulate
Oui,
-i
est également pris en charge dans FreeBSD/MacOSXsed
, mais les besoins de la chaîne vide comme un argument pour modifier un fichier en place.-i
n'avez pas besoin d'une chaîne vide. La valeur du paramètre est la sauvegarde de l'extension à utiliser, lorsque c'est la chaîne vide - pas de sauvegarde sera effectuée. Sur GNU sed la valeur par défaut pour-i
est une chaîne vide.Si vous ne souhaitez pas déplacer autour de copies, vous pouvez utiliser ed:
Kernighan et le Brochet dans The Art of Unix Programming discuter de cette question. Leur solution est d'écrire un script appelé
overwrite
, qui permet de faire de telles choses.L'utilisation est:
overwrite
file
cmd
file
.Une fois que vous avez le script ci-dessus dans votre
$PATH
, vous pouvez le faire:Pour rendre votre vie plus facile, vous pouvez utiliser
replace
script dans le même livre:Avoir
replace
dans votre$PATH
trop vous permettra de dire:Vous pouvez utiliser
sponge
de la moreutils.Peut-être
-i
est gnu sed, ou tout simplement une ancienne version de sed, mais, de toute façon. Vous êtes sur la bonne voie. La première option est probablement le plus commun, la troisième option si vous voulez qu'il fonctionne partout (y compris solaris machines)... 🙂 ce sont les "standard" façons de le faire.-i
est également pris en charge dans FreeBSD/MacOSXsed
Pour modifier plusieurs fichiers (et enregistrer une sauvegarde de chacun d'eux *.bak):
perl -p -i-e "s/oldtext/newtext/g" *
-i
option n'est pas disponible en standardsed
.Vos solutions de rechange sont à votre troisième voie ou
perl
.Beaucoup de réponses, mais aucun d'eux n'est correcte. Ici est la bonne et la plus simple:
-i
drapeau est considéré comme "illégal" par sa version desed
. Il ne peut donc pas être utilisé...Solution de contournement à l'aide de descripteurs de fichiers ouverts:
Empêcher d'ouvrir le fichier d'être tronqué:
sed
est en cours d'exécution, vous vous retrouverez avec des données manquantes.