Ediciones in situ con sed en OS X

Resuelto SundayMonday asked hace 12 años • 8 respuestas

Me gustaría editar un archivo con sed en OS X. Estoy usando el siguiente comando:

sed 's/oldword/newword/' file.txt

La salida se envía al terminal. file.txt no se modifica. Los cambios se guardan en file2.txt con este comando:

sed 's/oldword/newword/' file1.txt > file2.txt

Sin embargo, no quiero otro archivo. Solo quiero editar file1.txt . ¿Cómo puedo hacer esto?

Probé el indicador -i. Esto da como resultado el siguiente error:

sed: 1: "file1.txt": invalid command code f
SundayMonday avatar Sep 28 '11 00:09 SundayMonday
Aceptado

Puede utilizar la -ibandera correctamente proporcionándole un sufijo para agregar al archivo respaldado. Ampliando su ejemplo:

sed -i.bu 's/oldword/newword/' file1.txt

Le dará dos archivos: uno con el nombre file1.txtque contiene la sustitución y otro con el nombre file1.txt.buque tiene el contenido original.

Ligeramente peligroso

Si desea sobrescribir destructivamente el archivo original, use algo como:

sed -i '' 's/oldword/newword/' file1.txt
      ^ note the space

Debido a la forma en que se analiza la línea, se requiere un espacio entre el indicador de opción y su argumento porque el argumento tiene longitud cero.

Aparte de la posibilidad de destrozar el original, no conozco ningún peligro adicional de engañar a sed de esta manera. Sin embargo, debe tenerse en cuenta que si esta invocación sedes parte de un script, The Unix Way™ sería (en mi humilde opinión) utilizarlo sedde forma no destructiva, probar que salió limpiamente y solo entonces eliminar el archivo superfluo.

whittle avatar Sep 27 '2011 17:09 whittle

La -ibandera probablemente no funcione para usted, porque siguió un ejemplo para GNU sed mientras que macOS usa BSD sed y tienen una sintaxis ligeramente diferente.

Todas las demás respuestas le indican cómo corregir la sintaxis para que funcione con BSD sed. La alternativa es instalar GNU sed en tu macOS con:

brew install gsed

y luego úselo en lugar de la sedversión enviada con macOS (tenga en cuenta el gprefijo), por ejemplo:

gsed -i 's/oldword/newword/' file1.txt

Si desea que los comandos GNU sed sean siempre portátiles para su macOS, puede anteponer el directorio "gnubin" a su ruta, agregando algo como esto a su archivo .bashrc/ .zshrc(ejecute brew info gsedpara ver qué debe hacer exactamente):

export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"

y a partir de ese momento, el sed GNU se convierte en su sed predeterminado y simplemente puede ejecutar:

sed -i 's/oldword/newword/' file1.txt
Jakub Kukul avatar Jan 03 '2021 02:01 Jakub Kukul

Tengo un problema similar con MacOS.

sed -i '' 's/oldword/newword/' file1.txt

no funciona, pero

sed -i"any_symbol" 's/oldword/newword/' file1.txt

funciona bien.

ksnt avatar Jun 19 '2014 06:06 ksnt
sed -i -- "s/https/http/g" file.txt
jazzed avatar May 09 '2018 03:05 jazzed