GNU/Linux >> Tutoriales Linux >  >> Linux

indicador in situ sed que funciona tanto en Mac (BSD) como en Linux

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 instalar gnu-sed
  • Revise sus guiones para elegir entre gsed o sed 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.


Linux
  1. Consejos y trucos de Linux .htaccess

  2. Sistemas de archivos compatibles y recomendados en Linux

  3. Encuentre el archivo y luego cd a ese directorio en Linux

  4. (C/C++) ¿Cómo generar un archivo ejecutable que pueda ejecutarse tanto en Windows como en Linux?

  5. Búsqueda recursiva y reemplazo en archivos de texto en Mac y Linux

Cómo editar archivos de hosts en Linux, Windows o Mac

Cómo montar y desmontar sistemas de archivos en Linux

Comando Ls en Linux (Lista de archivos y directorios)

Archivo host de Linux:¿Cómo editarlo y usarlo?

Una introducción al hashing y las sumas de verificación en Linux

Cómo crear y usar un archivo de intercambio en Linux