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
PATH
como se indica después de instalargnu-sed
- Revise sus guiones para elegir entre
gsed
osed
dependiendo 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 -e
ya que la extensión del archivo de copia de seguridad se establecería en-e
- no puedo usar
sed -i'' -e
por las mismas razones:necesita un espacio entre-i
y''
.
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.