sed -i sous Mac OS X
sed -i
permet d’effecteur des modifications directement dans les fichiers passés en paramètre, -i
signifiant in place. man sed
dans le Terminal nous donne plus d’information sur cette option :
-i extension Edit files in-place, saving backups with the specified extension. If a zero-length extension is given, no backup will be saved. It is not recommended to give a zero-length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is exhausted, etc.
On voit qu’il est possible grâce à extension
de faire une sauvegarde des fichiers avant de les modifier et surtout qu’il est possible que extension
soit vide. Essayons donc :
$ cat > file.txt Ceci est un fichier de TEST. $ more file.txt Ceci est un fichier de TEST. $ sed 's/TEST/test/g' file.txt Ceci est un fichier de test. $ sed -i 's/TEST/test/g' file.txt sed: 1: "file.txt": invalid command code f
Allons bon… Je ne suis pas un spécialiste de sed
mais j’étais certain de la validité de ma commande. De un parce qu’elle m’a été donné sur un forum par des gens à qui je fais confiance et de deux parce qu’elle est semblable à l’exemple donné dans mon bouquin sur Unix. Un petit coup de Google et je tombe sur cet article : Sed in Mac OS X. Il est donc obligatoire de donner une chaine non-vide pour extension
… Même si le manuel dit que ce n’est pas obligatoire… Testons :
$ sed -i bk 's/TEST/test/g' file.txt $ more file.txt Ceci est un fichier de test. $ ls file* file.txt file.txtbk
Hum……… OK je retiens ^^
PS : il s’avère qu’on peut faire ceci :
$ sed -i '' 's/TEST/test/g' file.txt
Comme d’hab, un coup d’oeuil à la spec officielle pour tirer ça au clair…
http://pubs.opengroup.org/onlinepubs/9699919799/
On trouve sed dans Shell&Utilities > Utilities.
Et… il n’y a pas du tout d’option -i! Conclusion: mauvais bouquin, changer bouquin. A moins qu’ils ne l’aient précisé quelque part… leur exemple ne fonctionne qu’avec certains systèmes POSIX, mais sûrement pas avec tous les UNIX.
Il est donc dangereux d’utiliser cette option -i en espérant qu’elle fasse la même chose sur tous les systèmes ou le script pourrait être utilisé. Il vaut mieux faire soi-même la sauvegarde et l’écrasement du fichier original, ou alors, tester que l’option fonctionne et fait ce qu’on veut avant de risquer de détruire des fichiers.
J’aimeJ’aime
8 décembre 2013 à 7:15
Bouquin daté de 2005. Posix daté de 2008. Mise à jour bouquin demandé.
Non mais surtout c’est la page de man qui doit être changé ! Saleté !
J’aurais surtout dit « avant que ça plante ».
J’aimeJ’aime
10 décembre 2013 à 10:28
Les pages de man fournies avec le système décrivent les outils installés sur le système en question.
Je pense que la page de man est correcte, elle dit bien zero-length extension.
Essaie ceci (j’ai pas de mac sous la main…):
sed -i » …
Je pense que ça devrrait marcher.
Sinon, sous linux on peut installer les manpages POSIX et y accéder avec « man 3posix commande ». Je ne sais pas s’il y a un équivalent sous Mac OS X, mais le texte est le même que sur le site de l’opengroup.
Sinon, sed marchait déjà comme ça dans POSIX en 1997: http://pubs.opengroup.org/onlinepubs/007908799/xcu/sed.html
J’aimeJ’aime
10 décembre 2013 à 10:42
Je regarde dans Ubuntu, il y a une option –posix pour désactiver les extensions GNU. Faudra que je regarde sous Mac s’il y a une option du même genre.
Et je testerai le coup du » pour donner l’extension. En tout cas, sous Ubuntu, ce n’est pas nécessaire pour que ça fonctionne sans erreur.
J’aimeJ’aime
12 décembre 2013 à 1:53
En effet, GNU sed (la version utilisée par Ubuntu et la plupart des distributions Linux) précise bien un suffixe optionnel (et pas vide comme pour le sed de Mac OS X).
Je ne suis pas sur que –posix fonctionne dans ce cas: c’est plutôt pour être compatible au niveau des regexp et des commandes. C’est bien expliqué dans la doc de GNU sed.
J’aimeJ’aime
12 décembre 2013 à 1:59
sed -i » ‘s/test/TESTS/p’ file.txt fonctionne 🙂
J’aimeJ’aime
14 décembre 2013 à 11:10
Sinon tu peux installer gsed via macport.
Ça peut être utile si tu développe sous OS X et héberge sur Linux… Tu n’as plus 2 versions à maintenir mais une!
J’aimeJ’aime
23 juin 2014 à 5:52