Sous OSX, j'installe toujours la version GNU sed via Homebrew, pour éviter les problèmes de scripts, car la plupart des scripts ont été écrits pour les versions GNU sed.
brew install gnu-sed --with-default-names
Ensuite, votre BSD sed sera remplacé par GNU sed.
Alternativement, vous pouvez installer sans les noms par défaut, mais alors :
- Modifier votre
PATH
comme indiqué après l'installation degnu-sed
- Vérifiez vos scripts pour choisir entre
gsed
oused
selon votre système
Cela fonctionne avec GNU sed, mais pas sur OS X :
sed -i -e 's/foo/bar/' target.file
sed -i'' -e 's/foo/bar/' target.file
Cela fonctionne sur OS X, mais pas avec GNU sed :
sed -i '' -e 's/foo/bar/' target.file
Sur OS X, vous
- ne peut pas utiliser
sed -i -e
puisque l'extension du fichier de sauvegarde serait définie sur-e
- ne peut pas utiliser
sed -i'' -e
pour les mêmes raisons—il faut un espace entre-i
et''
.
Si vous voulez vraiment utiliser sed -i
la manière "facile", ce qui suit fonctionne à la fois sur GNU et BSD/Mac sed
:
sed -i.bak 's/foo/bar/' filename
Notez le manque d'espace et le point.
Preuve :
# GNU sed
% sed --version | head -1
GNU sed version 4.2.1
% echo 'foo' > file
% sed -i.bak 's/foo/bar/' ./file
% ls
file file.bak
% cat ./file
bar
# BSD sed
% sed --version 2>&1 | head -1
sed: illegal option -- -
% echo 'foo' > file
% sed -i.bak 's/foo/bar/' ./file
% ls
file file.bak
% cat ./file
bar
Évidemment, vous pouvez alors simplement supprimer le .bak
fichiers.
Comme le demande Noufal Ibrahim, pourquoi ne pouvez-vous pas utiliser Perl ? Tout Mac aura Perl, et il y a très peu de distributions Linux ou BSD qui n'incluent pas une version de Perl dans le système de base. L'un des seuls environnements qui pourraient réellement manquer de Perl serait BusyBox (qui fonctionne comme GNU/Linux pour -i
, sauf qu'aucune extension de sauvegarde ne peut être spécifiée).
Comme le recommande ismail,
Puisque perl est disponible partout, je fais juste
perl -pi -e s,foo,bar,g target.file
et cela semble être une meilleure solution dans presque tous les cas que les scripts, les alias ou d'autres solutions de contournement pour faire face à l'incompatibilité fondamentale de sed -i
entre GNU/Linux et BSD/Mac.