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

7 Réponses

  1. 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’aime

    8 décembre 2013 à 7:15

  2. 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’aime

    10 décembre 2013 à 10:28

  3. 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’aime

    10 décembre 2013 à 10:42

  4. 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’aime

    12 décembre 2013 à 1:53

  5. 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’aime

    12 décembre 2013 à 1:59

  6. Said

    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’aime

    23 juin 2014 à 5:52

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.