Cuando estoy en OSX, siempre instalo la versión sed de GNU a través de Homebrew, para evitar problemas en los scripts, porque la mayoría de los scripts se escribieron para versiones sed de GNU.
brew install gnu-sed --with-default-names
Entonces su BSD sed será reemplazado por GNU sed.
Alternativamente, puede instalar sin nombres predeterminados, pero luego:
- Cambia tu
PATHcomo se indica después de instalargnu-sed - Revise sus guiones para elegir entre
gsedoseddependiendo de su sistema
Esto funciona con GNU sed, pero no con OS X:
sed -i -e 's/foo/bar/' target.file
sed -i'' -e 's/foo/bar/' target.file
Esto funciona en OS X, pero no con GNU sed:
sed -i '' -e 's/foo/bar/' target.file
En OS X,
- no puedo usar
sed -i -eya que la extensión del archivo de copia de seguridad se establecería en-e - no puedo usar
sed -i'' -epor las mismas razones:necesita un espacio entre-iy''.
Si realmente quieres usar sed -i de la manera 'fácil', lo siguiente SÍ funciona tanto en GNU como en BSD/Mac sed :
sed -i.bak 's/foo/bar/' filename
Tenga en cuenta la falta de espacio y el punto.
Prueba:
# 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
Obviamente, podría simplemente eliminar el .bak archivos.
Como pregunta Noufal Ibrahim, ¿por qué no puedes usar Perl? Cualquier Mac tendrá Perl, y hay muy pocas distribuciones de Linux o BSD que no incluyan alguna versión de Perl en el sistema base. Uno de los únicos entornos que podría carecer de Perl sería BusyBox (que funciona como GNU/Linux para -i , excepto que no se puede especificar ninguna extensión de copia de seguridad).
Como recomienda ismail,
Dado que Perl está disponible en todas partes, solo hago perl -pi -e s,foo,bar,g target.file
y esta parece ser una mejor solución en casi todos los casos que los scripts, alias u otras soluciones para lidiar con la incompatibilidad fundamental de sed -i entre GNU/Linux y BSD/Mac.